Skip to content

代理模式

代理模式(Proxy Pattern) 是一种 结构型设计模式,它通过提供一个代理对象来控制对目标对象的访问。

核心组成

  1. Subject(抽象主题):定义目标对象和代理对象的公共接口,客户端通过该接口访问对象。
  2. RealSubject(真实主题): 实现了具体业务逻辑的对象,是被代理的对象。
  3. Proxy(代理):持有 RealSubject 的引用,在调用前后可以添加额外操作。

使用场景

应用领域示例
Spring AOPSpring 使用动态代理实现切面编程(如日志、事务、安全)
远程调用框架如 Dubbo、gRPC 中的远程服务代理
数据库连接池如 HikariCP、Druid 使用代理封装 Connection
权限控制如 Shiro、Spring Security 中的方法级权限控制
图片/资源加载虚拟代理用于延迟加载大资源,如图片、视频等
缓存中间件使用代理缓存方法结果,如 Redis + 代理实现缓存机制

示例:

抽象主题接口:

java
public interface Subject {
    /**
     * 执行某个操作
     */
    void doSomething();

    /**
     * 获取当前状态
     *
     * @return 状态信息
     */
    String getStatus();
}

真实主题:

java

public class RealSubject implements  Subject {



    /**
     * 执行某个操作
     */
    @Override
    public void doSomething() {
        System.out.println("RealSubject: 执行某个操作");
    }

    /**
     * 获取当前状态
     *
     * @return 状态信息
     */
    @Override
    public String getStatus() {
        System.out.println("RealSubject: 获取当前状态");
        return "";
    }

}

代理:

java
public class ProxySubject implements  Subject {

    private final RealSubject realSubject;

    public ProxySubject(RealSubject realSubject) {
        this.realSubject = realSubject;
    }

    /**
     * 执行某个操作
     */
    @Override
    public void doSomething() {
        System.out.println("ProxySubject: 在执行操作之前做一些准备工作");
        realSubject.doSomething();
        System.out.println("ProxySubject: 在执行操作之后做一些清理工作");
    }

    /**
     * 获取当前状态
     *
     * @return 状态信息
     */
    @Override
    public String getStatus() {
        System.out.println("ProxySubject: 获取状态前的处理");
        return realSubject.getStatus();
    }
}
java
    public static void main(String[] args) {
        ProxySubject proxySubject = new ProxySubject(new RealSubject());
        proxySubject.doSomething();
        proxySubject.getStatus();
    }
最近更新