结构型模式
- 适配器模式(Adapter Pattern)
- 桥接模式(Bridge Pattern)
- 组合模式(Composite Pattern)
- 装饰器模式(Decorator Pattern)
- 外观模式(Facade Pattern)
- 享元模式(Flyweight Pattern)
- 代理模式(Proxy Pattern)
定义:代理模式是一种结构型设计模式,它提供了一个代理对象来控制对另一个对象的访问。通过代理对象,客户可以间接访问目标对象。代理对象通常用来在访问目标对象时提供附加功能,比如延迟加载、访问控制、日志记录等。
代理模式主要有以下三种类型:
- 虚拟代理:延迟对象的创建,只有在需要时才创建目标对象。
- 远程代理:表示一个对象在不同的地址空间(通常是远程机器)上的代理。
- 保护代理:控制访问权限,对目标对象进行访问控制。
代理模式的主要角色
- Subject:定义了代理和真实主题(RealSubject)所共享的接口。客户端通过这个接口与真实对象或代理对象进行交互。
- RealSubject:实现了
Subject
接口,表示真实的业务对象。 - Proxy:实现了
Subject
接口,并持有一个真实的RealSubject
对象,负责控制对RealSubject
的访问。
代理模式的应用场景
- 延迟加载:只有在需要时才加载某些资源。
- 访问控制:在某些情况下控制对对象的访问,避免直接暴露给客户端。
- 日志记录:在代理对象中添加日志记录功能,记录对目标对象的操作。
- RealShoppingCart 类表示真实的购物车,实际进行结账操作。现在输出的文本已经改为中文:“结账:正在处理支付和配送。”
- ShoppingCartProxy 类添加了额外的检查功能,并在每个检查环节输出中文提示:“代理:用户未登录,请先登录后继续。”、“代理:余额不足,请充值后继续。” 和 “代理:所有检查通过,正在进行结账。”
- Client 类模拟了不同的用户场景,分别输出不同的中文提示信息。
public interface ShoppingCart {
void checkout(); // 用户结账购买商品
}
public class RealShoppingCart implements ShoppingCart {
@Override
public void checkout() {
System.out.println("结账:正在处理支付和配送。");
}
}
public class ShoppingCartProxy implements ShoppingCart {
private RealShoppingCart realShoppingCart;
private boolean isLoggedIn; // 模拟用户登录状态
private double userBalance; // 模拟用户余额
public ShoppingCartProxy(boolean isLoggedIn, double userBalance) {
this.isLoggedIn = isLoggedIn;
this.userBalance = userBalance;
}
@Override
public void checkout() {
// 代理前的附加功能
if (!isLoggedIn) {
System.out.println("代理:用户未登录,请先登录后继续。");
return;
}
double totalAmount = 100.0; // 假设购物车的总金额是100
if (userBalance < totalAmount) {
System.out.println("代理:余额不足,请充值后继续。");
return;
}
// 如果没有问题,就调用真实对象的方法
if (realShoppingCart == null) {
realShoppingCart = new RealShoppingCart(); // 延迟加载真实购物车
}
System.out.println("代理:所有检查通过,正在进行结账。");
realShoppingCart.checkout(); // 真实对象进行结账操作
}
}
public class Client {
public static void main(String[] args) {
// 假设用户没有登录,余额足够
ShoppingCart cart1 = new ShoppingCartProxy(false, 200.0);
cart1.checkout(); // 输出:代理:用户未登录,请先登录后继续。
// 假设用户已登录,余额不足
ShoppingCart cart2 = new ShoppingCartProxy(true, 50.0);
cart2.checkout(); // 输出:代理:余额不足,请充值后继续。
// 假设用户已登录,余额足够
ShoppingCart cart3 = new ShoppingCartProxy(true, 200.0);
cart3.checkout(); // 输出:代理:所有检查通过,正在进行结账。 结账:正在处理支付和配送。
}
}