文章目录
- 一、代理模式简介
- 二、代理模式适用场景
- 三、代理模式优缺点
- 四、代理扩展
- 五、代理模式相关设计模式
一、代理模式简介
代理模式 : 为 其它对象 提供 一种代理 , 以 控制 对 这个对象 的访问 ;
代理对象 在 客户端 和 目标对象 之间 起到 中介的作用 ;
如 : 租客通过中介找房东租房子 , 房东将房子托管给了中介 , 房东是目标对象 , 但是租赁行为是中介来执行的 , 中介是代理类 , 租客 就是 客户端 ; 中介 代理 房东 进行租赁行为 , 相当于 代理类对目标对象进行了增强 ;
客户端 通过 代理类 与 目标对象 进行交互 , 客户端 不直接接触 目标对象 ;
代理模式类型 : 结构性 ;
二、代理模式适用场景
代理模式适用场景 :
- 保护目标对象 : 客户端 只与 代理类 进行交互 , 不清楚 目标对象 的具体细节 ; 相当于 租客 只与 中介 进行交互 , 不知道房东的信息 ;
- 增强目标对象 : 代理类 在 目标对象的基础上 , 对 目标对象的功能 进行增强 ;
三、代理模式优缺点
代理模式优点 :
- 分离目标对象 : 代理模式 能将 代理对象 与 真实被调用的 目标对象 分离 ;
- 降低耦合 : 在一定程度上 , 降低了系统耦合性 , 扩展性好 ;
- 保护目标对象 : 代理类 代理目标对象的业务逻辑 , 客户端 直接与 代理类 进行交互 , 客户端 与 实际的目标对象之间没有关联 ;
- 增强目标对象 : 代理类 可以 在 目标对象基础上 , 添加新的功能 ;
代理模式缺点 :
- 类个数增加 : 代理模式 会 造成 系统中 类的个数 增加 , 比不使用代理模式增加了代理类 , 系统的复杂度增加 ; ( 所有的设计模式都有这个缺点 )
- 性能降低 : 在 客户端 和 目标对象 之间 , 增加了一个代理对象 , 造成 请求处理速度变慢 ;
四、代理扩展
静态代理 : 在代码中 , 使用指定的代理 ; 显示的定义了一个业务实现类代理 ; 在代理类中 , 对同名的业务方法进行包装 , 用户通过调用 代理类中 被包装过的业务逻辑方法 , 来调用 被包装对象 的业务方法 , 同时对目标对象的业务方法进行增强 ;
动态代理 : 由 JDK 提供 , 只能对 实现的接口的类 进行动态代理 , 不能代理具体的实现类 ; 通过 接口 中的 方法名 , 在 动态生成的 代理类 中 , 调用 业务实现类 的 同名方法 ;
JDK 动态代理 , 用到的代理类 , 是在程序调 用到代理对象时 , 由 Java 虚拟机创建 , Java 虚拟机 根据传入的 业务实现类对象 以及 方法名 , 动态地创建代理类 Class 文件 , 当该 Class 文件被字节码引擎执行 , 通过该代理类对象进行目标方法的调用 ;
动态代理无法代理类 , 只可以代理接口 ;
CGLib 代理 : 可以 针对类实现进行代理 ;
如果要 代理一个类 , CGLib 会生成一个被代理类的子类 , 通过 继承该类 并 覆盖其中的方法 ; 如果该类时 final 的 , 则无法被继承 , 如果类中的方法是 final 的 , 该方法无法被重写 ; 使用 CGLib 代理要特别注意 final 修饰符 ;
五、代理模式相关设计模式
代理模式和装饰者模式 :
- 装饰者模式 是为 目标对象 添加行为 ;
- 代理模式 目的是进行 控制访问 , 代理模式 注重 通过设置 代理对象 的方式 , 增强目标对象 , 一般是 增强目标对象的某些行为 ;
代理模式和适配器模式 :
- 适配器模式 主要 改变 所考虑对象的接口 ,
- 代理模式 不能 改变 代理类的接口 ,