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

举报
韩曙亮 发表于 2022/01/12 22:37:08 2022/01/12
【摘要】 文章目录 一、代理模式简介二、代理模式适用场景三、代理模式优缺点四、代理扩展五、代理模式相关设计模式 一、代理模式简介 代理模式 : 为 其它对象 提供 一种代理 ...





一、代理模式简介



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

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


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

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


代理模式类型 : 结构性 ;





二、代理模式适用场景



代理模式适用场景 :

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




三、代理模式优缺点



代理模式优点 :

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

代理模式缺点 :

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




四、代理扩展



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


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

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

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


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

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





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



代理模式和装饰者模式 :

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

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


代理模式和适配器模式 :

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

文章来源: hanshuliang.blog.csdn.net,作者:韩曙亮,版权归原作者所有,如需转载,请联系作者。

原文链接:hanshuliang.blog.csdn.net/article/details/119798155

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。