设计模式代理模式 ( 简介 | 适用场景 | 优缺点 | 代理扩展 | 相关设计模式 )

Posted 韩曙亮

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式代理模式 ( 简介 | 适用场景 | 优缺点 | 代理扩展 | 相关设计模式 )相关的知识,希望对你有一定的参考价值。





一、代理模式简介



代理模式 :其它对象 提供 一种代理 , 以 控制这个对象 的访问 ;

代理对象客户端目标对象 之间 起到 中介的作用 ;


如 : 租客通过中介找房东租房子 , 房东将房子托管给了中介 , 房东是目标对象 , 但是租赁行为是中介来执行的 , 中介是代理类 , 租客 就是 客户端 ;
中介 代理 房东 进行租赁行为 , 相当于 代理类对目标对象进行了增强 ;

客户端 通过 代理类 与 目标对象 进行交互 , 客户端 不直接接触 目标对象 ;


代理模式类型 : 结构性 ;





二、代理模式适用场景



代理模式适用场景 :

  • 保护目标对象 : 客户端 只与 代理类 进行交互 , 不清楚 目标对象 的具体细节 ; 相当于 租客 只与 中介 进行交互 , 不知道房东的信息 ;
  • 增强目标对象 : 代理类 在 目标对象的基础上 , 对 目标对象的功能 进行增强 ;




三、代理模式优缺点



代理模式优点 :

  • 分离目标对象 : 代理模式 能将 代理对象 与 真实被调用的 目标对象 分离 ;
  • 降低耦合 : 在一定程度上 , 降低了系统耦合性 , 扩展性好 ;
  • 保护目标对象 : 代理类 代理目标对象的业务逻辑 , 客户端 直接与 代理类 进行交互 , 客户端 与 实际的目标对象之间没有关联 ;
  • 增强目标对象 : 代理类 可以 在 目标对象基础上 , 添加新的功能 ;

代理模式缺点 :

  • 类个数增加 : 代理模式 会 造成 系统中 类的个数 增加 , 比不使用代理模式增加了代理类 , 系统的复杂度增加 ; ( 所有的设计模式都有这个缺点 )
  • 性能降低 : 在 客户端 和 目标对象 之间 , 增加了一个代理对象 , 造成 请求处理速度变慢 ;




四、代理扩展



静态代理 : 在代码中 , 使用指定的代理 ; 显示的定义了一个业务实现类代理 ; 在代理类中 , 对同名的业务方法进行包装 , 用户通过调用 代理类中 被包装过的业务逻辑方法 , 来调用 被包装对象 的业务方法 , 同时对目标对象的业务方法进行增强 ;


动态代理 : 由 JDK 提供 , 只能对 实现的接口的类 进行动态代理 , 不能代理具体的实现类 ; 通过 接口 中的 方法名 , 在 动态生成的 代理类 中 , 调用 业务实现类同名方法 ;

JDK 动态代理 , 用到的代理类 , 是在程序调 用到代理对象时 , 由 Java 虚拟机创建 , Java 虚拟机 根据传入的 业务实现类对象 以及 方法名 , 动态地创建代理类 Class 文件 , 当该 Class 文件被字节码引擎执行 , 通过该代理类对象进行目标方法的调用 ;

动态代理无法代理类 , 只可以代理接口 ;


CGLib 代理 : 可以 针对类实现进行代理 ;

如果要 代理一个类 , CGLib 会生成一个被代理类的子类 , 通过 继承该类覆盖其中的方法 ;
如果该类时 final 的 , 则无法被继承 , 如果类中的方法是 final 的 , 该方法无法被重写 ;
使用 CGLib 代理要特别注意 final 修饰符 ;





五、代理模式相关设计模式



代理模式和装饰者模式 :

  • 装饰者模式 是为 目标对象 添加行为 ;

  • 代理模式 目的是进行 控制访问 , 代理模式 注重 通过设置 代理对象 的方式 , 增强目标对象 , 一般是 增强目标对象的某些行为 ;


代理模式和适配器模式 :

  • 适配器模式 主要 改变 所考虑对象的接口 ,
  • 代理模式 不能 改变 代理类的接口 ,

以上是关于设计模式代理模式 ( 简介 | 适用场景 | 优缺点 | 代理扩展 | 相关设计模式 )的主要内容,如果未能解决你的问题,请参考以下文章

设计模式迭代器模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )

设计模式中介者模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )

设计模式组合模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )

设计模式桥接模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )

设计模式策略模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )

设计模式命令模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )