代理模式(委托模式)
一、定义
为其他对象提供一种代理以控制对这个对象的访问
代理模式的通用类图
Subject 为抽象主题角色,是一个普通的业务逻辑类型, RealSubject为具体主题角色,也叫做委托角色,被代理角色,是业务逻辑的具体执行者。 Proxy为代理主题角色,也叫做委托类,代理类,他负责对真实角色的应用,把所有抽象主题类定义的方法限制委托给真实主题角色实现,并且在真实主题角色处理完毕前后座预处理和善后处理工作
代理模式的通用源码
-
抽象主题类
public interface Subject { //定义一个方法 public void request(); }
-
真实主题类
public class RealSubject implements Subject { //实现方法 public void request() { //业务逻辑处理 } }
-
代理类
public class Proxy implements Subject { //要代理哪个实现类 private Subject subject = null; //默认被代理者 public Proxy(){ this.subject = new Proxy(); } //通过构造函数传递代理者 public Proxy(Object...objects ){ } //实现接口中定义的方法 public void request() { this.before(); this.subject.request(); this.after(); } //预处理 private void before(){ //do something } //善后处理 private void after(){ //do something } }
二、代理模式的优点
-
职责清晰
实际的业务逻辑由RealSubject实现,不用关心其他非本职责的事物
-
高扩展性
具体主题逻辑随时都会发生变化,只要他实现了接口,不论它如何变化,代理类不用做修改就可以直接使用
-
智能化
三、扩展
-
普通代理
要求客户端只能访问代理角色,不能访问真实角色
在改模式下,调用者只知代理而不用知道真实的角色是谁,屏蔽了真实角色变更对高层模块的影响。适用于扩展性要求较高的场合
在实际的项目中,一般是通过约定禁止new 一个真实的角色 来限制调用者使用真实的角色
普通代理的约束问题,尽量通过团队内的编程规范类约束,因为每一个主题类是可被重用和可维护的,使用技术约束的方式对系统维护是一种不利的因素
-
强制代理
强制代理要求通过真实角色查找到代理角色,否则不能访问,只有通过真实角色指定的代理类才可以访问,由真实角色管理代理角色,
高层模块new了一个真实角色的对象,返回的却是代理角色
-
代理类的个性
一个类可以实现多个的接口完成不同任务的整合。也就是说代理类不仅仅可以实现主题的接口,也可以实现其他接口完成不同的任务,而且代理的目的是在目标对象的方法的基础上增强,这种增强的本质是对目标对象的方法进行拦截和过滤
通常情况下代理的职责不一定单一,他可以组合其他的真实角色,也可以实现自己的职责。
一个代理类可以代理多个真实的角色,并且真实角色可以有耦合的关系。
-
动态代理
动态代理是在实现阶段不用关心代理谁,而在运行阶段才指定代理那一个对象。
来源:CSDN
作者:唯缘
链接:https://blog.csdn.net/qq_19269585/article/details/103845646