07-代理模式

跟風遠走 提交于 2020-01-11 06:25:25

代理模式(委托模式)

一、定义

为其他对象提供一种代理以控制对这个对象的访问

代理模式的通用类图
在这里插入图片描述
Subject 为抽象主题角色,是一个普通的业务逻辑类型, RealSubject为具体主题角色,也叫做委托角色,被代理角色,是业务逻辑的具体执行者。 Proxy为代理主题角色,也叫做委托类,代理类,他负责对真实角色的应用,把所有抽象主题类定义的方法限制委托给真实主题角色实现,并且在真实主题角色处理完毕前后座预处理和善后处理工作

代理模式的通用源码

  1. 抽象主题类

      public interface Subject {
      //定义一个方法
      public void request();
      }
    
  2. 真实主题类

    public class RealSubject implements Subject {
    	//实现方法
    	public void request() {
    		//业务逻辑处理
    	}
    }
    
  3. 代理类

    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实现,不用关心其他非本职责的事物

  • 高扩展性

    具体主题逻辑随时都会发生变化,只要他实现了接口,不论它如何变化,代理类不用做修改就可以直接使用

  • 智能化

三、扩展

  1. 普通代理

    要求客户端只能访问代理角色,不能访问真实角色

    在改模式下,调用者只知代理而不用知道真实的角色是谁,屏蔽了真实角色变更对高层模块的影响。适用于扩展性要求较高的场合

    在实际的项目中,一般是通过约定禁止new 一个真实的角色 来限制调用者使用真实的角色

    普通代理的约束问题,尽量通过团队内的编程规范类约束,因为每一个主题类是可被重用和可维护的,使用技术约束的方式对系统维护是一种不利的因素

  2. 强制代理

    强制代理要求通过真实角色查找到代理角色,否则不能访问,只有通过真实角色指定的代理类才可以访问,由真实角色管理代理角色,

    高层模块new了一个真实角色的对象,返回的却是代理角色

  3. 代理类的个性

    一个类可以实现多个的接口完成不同任务的整合。也就是说代理类不仅仅可以实现主题的接口,也可以实现其他接口完成不同的任务,而且代理的目的是在目标对象的方法的基础上增强,这种增强的本质是对目标对象的方法进行拦截和过滤

    通常情况下代理的职责不一定单一,他可以组合其他的真实角色,也可以实现自己的职责。

    一个代理类可以代理多个真实的角色,并且真实角色可以有耦合的关系。

  4. 动态代理

    动态代理是在实现阶段不用关心代理谁,而在运行阶段才指定代理那一个对象。

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!