Skip to content

代理模式

字数: 0 字 时长: 0 分钟

简介

代理模式(Proxy Pattern)核心思想是:给某个对象提供一个代理对象,并由代理对象来控制对这个对象的访问。其实真实业务逻辑还是真实对象执行的,代理对象只是可以在不改变原生对象代码情况下,对原始对象进行功能增强或控制访问

UML 类图

proxy.webp

  • 主题接口(Subject):定义了真实对象和代理对象都需要实现的方法
  • 真实主题(RealSubject):目标对象,真正去执行核心业务逻辑
  • 代理主题(ProxySubject):代理对象,内部维护一个真实对象的引用,在调用前后进行功能增强

实现示例

延迟加载

利用代理模式来增强真实对象方法,实现延迟加载

java
// 1. 主题接口 (大文件操作)
interface LargeFile {
    void download();
}

// 2. 真实对象实现  -- 加载成本高
class RealLargeFile implements LargeFile {
    private String fileName;
    public RealLargeFile(String fileName) {
        this.fileName = fileName;
        System.out.println("开始耗时加载任务:" + fileName);
    }
    @Override
    public void download() {
        System.out.println("开始下载:" + fileName);
    }
}

// 3. 代理对象实现
class ProxyLargeFile implements LargeFile {
    private String fileName;
    // 内部维护一个真实对象引用
    private RealLargeFile realFile;
    public ProxyLargeFile(String fileName) {
        this.fileName = fileName;
    }
    @Override
    public void download() {
        // 进行访问增强(首次访问才加载真实对象)
        if (realFile == null) {
            realFile = new RealLargeFile(fileName);
        }
        realFile.download();
    }
}

// 4. 客户端调用
public static void main(String[] args) {
    LargeFile file = new LargeFileProxy("大文件.zip");
    // ... 用户操作
    
    // 直到访问时才加载文件
    file.download();
}

日志代理

利用代理模式来对真实对象进行前置增强后置增强

java
// 1. 主题接口 (商务服务接口)
interface BusinessService {
    void operation();
}

// 2. 真实对象 (订单服务)
class OrderService implements BusinessService {
    @Override
    public void operation() {
        System.out.println("订单服务开始处理...");
    }
}

// 3. 代理对象 (日志处理增强)
class LogProxy implements BusinessService {
    private BusinessService realService = new OrderService();
    private Logger logger = Logger.getLogger(LogProxy.class);
    @Override
    public void operation() {
        logger.info("开始处理...");
        realService.operation();
        logger.info("处理完成...");
    }
}

JDK 动态代理

JDK 提供了一整套动态代理实现

java
public class JdkDynamicProxy {
s
    interface Service {
        void execute();
    }

    static class RealService implements Service {
        @Override
        public void execute() {
            System.out.println("执行实际业务");
        }
    }

    static class ProxyService implements InvocationHandler {
        private Object target;
        public ProxyService(Object target) {
            this.target = target;
        }

        @Override
        public Object invoke(Object proxy, Method method, Object[] args)
                throws Throwable {
            // 调用前增强
            System.out.println(method.getName() + "方法执行前");
            // 执行实际业务
            Object result = method.invoke(target, args);
            // 调用后增强
            System.out.println(method.getName() + "方法执行后");
            return result;
        }
    }

    public static void main(String[] args) {
        Service service = new RealService();
        Service proxy = (Service) Proxy.newProxyInstance(
                Service.class.getClassLoader(),
                new Class<?>[] {Service.class},
                new ProxyService(service)
        );
        proxy.execute();
        /**
         * 输出结果:
         * execute方法执行前
         * 执行实际业务
         * execute方法执行后
         */
    }

}