介绍
Provide a surrogate or placeholder for another object to control access to it.(为其他对象提供一种代理以控制对这个对象的访问。 ) -设计模式之禅第2版
我的理解是,将非主要但又与业务流程相关的业务分给代理类处理。比如,顾客吃饭,要操心的是吃什么饭,怎么吃以及付钱。至于买菜,洗菜,做饭,盛饭,刷锅之类的事情,不需要顾客亲自动手
通用类图及通用代码
代理模式也有好多变种,这里先给一个完整的,其它的变种版本只看变化细节好了
完整
类图
代码
ISubject
package cn.zjm404.stu.design.organization.proxy;public interface ISubject {public void method();}
Proxy
package cn.zjm404.stu.design.organization.proxy;public class Proxy implements ISubject{private ISubject iSubject;public Proxy(ISubject _subject){this.iSubject = _subject;}@Overridepublic void method() {//这边是代理角色组装的方法proxyMethod1();iSubject.method();}private void proxyMethod1(){//代理角色添加的方法}}
Subject
package cn.zjm404.stu.design.organization.proxy;public class Subject implements ISubject{@Overridepublic void method() {//写要完成的任务}}
Client
package cn.zjm404.stu.design.organization.proxy;public class Client {public static void main(String[] args) {Proxy proxy = new Proxy(new Subject());proxy.method();}}
普通代理:只暴露代理类
也就是Proxy构造时,不传入被代理类对象了,在构造函数中实例化被代理类
如果被代理类有属性的化,代理类的构造函数就传被代理类的属性就好
package cn.zjm404.stu.design.organization.proxy;public class Proxy implements ISubject{private ISubject iSubject;public Proxy(){this.iSubject = new Subject;}@Overridepublic void method() {//这边是代理角色组装的方法proxyMethod1();iSubject.method();}private void proxyMethod1(){//代理角色添加的方法}}
强制代理:指定代理类
被代理对象聚合指定的代理类,然后获取它。在执行前判断一下proxy是否为null来确定是否为指定的proxy
package cn.zjm404.stu.design.organization.proxy;public class Subject implements ISubject{private Proxy proxy;@Overridepublic void method() {if(!isProxy()){//抛出一个异常~}//写要完成的任务}public ISubject getProxy(){this.proxy = new Proxy(this);return this.proxy;}public boolean isProxy(){return this.proxy != null;}}
动态代理
介绍及类图
上面的代理有一个小问题,就是要代理的话,得和被代理类“成为兄弟”,这样,如果多个被代理类不是“亲戚”且数量较多的话,代理类就太多了。如果这些代理类的处理逻辑相同的话,那么可以使用动态代理来减少重复代码。简单来说就是消去 Proxy 与 ISubject 的关联
变成以下,避免 Proxy 与 ISubject 产生直接依赖,改为使用反射来实现 Object 到 Subject 的转换
