代理 (Proxy)
代理 (Proxy) 是一种结构型设计模式,为某对象提供一种代理以控制对该对象的访问。客户端通过代理间接地访问真实对象,从而可限制、增强或修改该对象的特性(如懒加载、权限、日志、缓存)。
- 希望在不直接暴露或修改真实对象的前提下,控制对它的访问(如按需创建、加权限、记日志)。
- 客户端希望用“与真实对象相同的接口”来操作,以保持透明。
- 定义主题接口 (Subject):真实对象与代理都实现该接口,保证客户端可统一使用。
- 真实主题 (RealSubject):完成实际业务逻辑。
- 代理 (Proxy):实现 Subject,内部持有 RealSubject(或按需创建);在接口方法中先执行附加逻辑(权限、日志、懒加载等),再委托给 RealSubject。
classDiagram
class Subject {
<<interface>>
+request()* void
}
class RealSubject {
+request() void
}
class Proxy {
-realSubject RealSubject
+request() void
}
class Client
Subject <|.. RealSubject
Subject <|.. Proxy
Proxy o-- RealSubject
Client ..> Subject : uses
Java 示例
Section titled “Java 示例”public interface Subject { void request();}
public class RealSubject implements Subject { @Override public void request() { System.out.println("RealSubject.request"); }}
public class Proxy implements Subject { private RealSubject realSubject;
@Override public void request() { if (realSubject == null) { realSubject = new RealSubject(); // 懒加载 } System.out.println("Proxy 前置处理"); realSubject.request(); System.out.println("Proxy 后置处理"); }}
// 客户端public class Client { public static void main(String[] args) { Subject subject = new Proxy(); subject.request(); // 输出: Proxy 前置处理 / RealSubject.request / Proxy 后置处理 }}代理通过实现与真实对象相同的接口并委托调用,在不改变客户端使用方式的前提下,增加访问控制、懒加载、日志等能力。