跳转到内容

代理 (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
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 后置处理
}
}

代理通过实现与真实对象相同的接口并委托调用,在不改变客户端使用方式的前提下,增加访问控制、懒加载、日志等能力。