1. 定义
为另一个对象提供替身或占位符以控制对这个对象的访问。
2. 角色
- Subject:抽象主题类
- Proxy:代理主题类
- RealSubject:真实主题类
3. 特点
- 优点:能够协调调用者和被调用者,降低了系统的耦合度。其中远程代理使得客户端可以访问远程的对象,而远程的服务器可能有更好的计算性能和处理速度,可以加速响应处理客户端请求;虚拟代理可以通过一个小对象代理一个较大的对象,可以减少系统资源的消耗;保护代理可以控制对真实对象的访问权限。
- 缺点:在客户端和真实主题之间添加了代理类,需要做额外的工作。
4. 示例
Subject:
public interface Subject {
void request();
}
RealSubject:
public class RealSubject implements Subject {
@Override
public void request() {
System.out.println("this is real subject");
}
}
Proxy:
public class Proxy implements Subject {
private RealSubject realSubject;
public Proxy(RealSubject realSubject) {
this.realSubject = realSubject;
}
@Override
public void request() {
preRequest();
realSubject.request();
afterRequest();
}
public void preRequest() {
System.out.println("before request");
}
public void afterRequest() {
System.out.println("after request");
}
}
测试类:
public class TestProxy {
public static void main(String[] args) {
Proxy proxy = new Proxy(new RealSubject());
proxy.request();
}
}
参考:
1. 《Head First 设计模式》
2. 《图说设计模式》https://design-patterns.readthedocs.io/zh_CN/latest/structural_patterns/proxy.html