Java设计模式之结构型模式(代理模式)介绍与说明

一、代理模式的核心概念

  1. 定义
    代理模式为对象提供一个代理(或占位符),通过代理对象控制对目标对象的访问,实现权限控制、功能增强或延迟加载等需求。例如,生活中通过中介购房,避免直接与房主接触,即为代理模式的典型应用。

  2. 核心作用

    • 隔离客户端与目标对象:客户端不直接操作目标对象,降低耦合度。
    • 功能增强:在调用目标方法前后添加日志、权限校验、缓存等逻辑。
    • 控制访问:如远程调用、安全权限过滤、延迟加载等场景。

二、代理模式的结构

代理模式通常包含以下角色:

  1. 抽象主题(Subject)
    定义目标对象和代理对象的公共接口,确保两者具有相同的调用方式。例如,定义一个Subject接口,声明request()方法。

  2. 真实主题(RealSubject)
    实现抽象主题的接口,完成实际业务逻辑。例如,RealSubject类实现request()方法处理核心功能。

  3. 代理(Proxy)
    实现抽象主题接口,持有真实主题的引用,并在调用其方法前后添加额外逻辑。例如,代理类Proxy在调用realSubject.request()前执行权限检查,之后记录日志。


三、代理模式的类型

根据代理对象的生成时机和实现方式,代理模式分为以下两种主要类型:

  1. 静态代理
  • 实现方式:在编译时生成代理类,需手动编写代理代码。代理类与目标类实现相同的接口,并通过组合持有目标对象的引用。
  • 优点:实现简单,逻辑清晰。
  • 缺点:代码冗余,若接口变更需同步修改代理类。
  • 示例:
    public class Proxy implements Subject {
        private RealSubject realSubject;
        public Proxy(RealSubject realSubject) { this.realSubject = realSubject; }
        @Override
        public void request() {
            before(); // 预处理逻辑
            realSubject.request();
            after(); // 后处理逻辑
        }
    }
    
  1. 动态代理
  • 实现方式:在运行时动态生成代理类,分为两种实现:
    • JDK动态代理:基于java.lang.reflect.Proxy类,要求目标类实现接口。
    • CGLIB动态代理:通过继承目标类生成子类代理,无需接口,但不能代理final类或方法。
  • 优点:灵活高效,减少代码冗余。
  • 缺点:性能稍低,需处理反射开销。
  • 示例(JDK动态代理):
    InvocationHandler handler = new MyInvocationHandler(target);
    Subject proxy = (Subject) Proxy.newProxyInstance(
        target.getClass().getClassLoader(),
        target.getClass().getInterfaces(),
        handler
    );
    

四、代理模式的应用场景

  1. 远程代理(Remote Proxy)
    隐藏远程服务调用细节,如通过代理对象处理网络通信和序列化。

  2. 虚拟代理(Virtual Proxy)
    延迟加载大对象,例如图片预加载时先显示占位符,加载完成后替换为真实资源。

  3. 安全代理(Protection Proxy)
    在访问目标对象前进行权限校验,如Spring Security中的AOP权限控制。

  4. 缓存代理(Cache Proxy)
    缓存高频调用结果,减少重复计算或数据库查询。

  5. 日志与事务代理
    在方法调用前后记录日志或管理事务,如Spring AOP的事务增强。


五、优缺点分析

优点 缺点
降低系统耦合度,提高扩展性 增加系统复杂度,引入额外类
功能增强灵活(如日志、缓存) 可能引入性能开销(动态代理)
隔离客户端与目标对象变更 静态代理代码冗余

六、实际应用案例

  1. Spring AOP
    Spring框架通过动态代理实现AOP,如事务管理、日志记录等功能。
  2. 数据库连接池
    代理对象管理数据库连接,避免频繁创建和销毁连接。
  3. 远程服务调用(RPC)
    代理对象封装网络通信细节,客户端透明调用远程服务。

总结

代理模式通过引入中间层,实现了对目标对象的控制与增强,是解决复杂系统中访问控制和功能扩展的经典方案。静态代理适用于简单场景,而动态代理(尤其是JDK和CGLIB)在Spring等框架中广泛应用,成为企业级开发的基石。

你可能感兴趣的:(#,Java知识点,java,开发语言,笔记,代理模式,学习)