代理模式(Proxy):为其他对象提供一种代理以控制对这个对象的访问。代理模式分为静态代理(所代理的类型是固定的,见下例)和动态代理(可以代理任何类型)
类图:
代码:
publicinterface Subject {
publicvoidrequest();
}
publicclass RealSubjectimplements Subject {
@Override
publicvoid request() {
System.out.println("实际操作");
}
}
publicclass Proxyimplements Subject{
private Subjectsubject;
public Proxy(Subject subject){
this.subject=subject;
}
@Override
publicvoid request() {
System.out.println("操作前检查/日志");
subject.request();
}
}
publicstaticvoid main(String[]args) {
//客户端
Subject sub=new RealSubject();
sub=new Proxy(sub);
sub.request();
}
优点:隐藏了被代理类。
缺点:none
代理模式与适配器,装饰和外观很相似,都是把原有的功能重新包装而成为新的功能。适配器:把功能的接口统一;装饰:提升功能的实现;外观:组合功能;代理:隐藏功能的实现。
四种模式的比较:
| 适配器 | 装饰 | 外观 | 代理 |
外部调用 | 方便 | 麻烦 | 很方便 | 一般 |
扩展性 | 弱 | 强 | 弱 | 一般 |
复杂程度 | 一般 | 复杂 | 简单 | 一般 |