设计模式-代理模式

来源:互联网 发布:分级诊疗 知乎 编辑:程序博客网 时间:2024/05/19 04:06

java学习之路-设计模式-代理模式
参考书籍《设计模式之禅》
代理模式分为两种:静态代理,动态代理
代理模式定义
三个角色

  1. subject抽象主题角色
    可以是接口或者抽象类,是一个最普通的业务类型定义。

  2. realsubject实现了接口的具体主题角色
    这个是被委托类,被代理类,真正的业务逻辑实现者

  3. proxy实现了相同接口的代理角色
    也叫委托类,代理类,代理模式核心在代理类上。
    一个代理类可以代理多个被代理类,因此一个代理类具体代理哪个真实对象应该由具体的场景类决定。

代理模式优点

-职责清晰,高扩展性,智能化
真实的对象就是实现实际的业务逻辑。不用关心其他业务逻辑的实现

静态代理
静态代理分为两种:普通代理,强制代理


普通代理

  1. 知道代理者的存在,要求客户端只能访问代理角色,而不能访问真实角色。
  2. 代理类的构造函数
代理类 GamePlayerProxy被代理类 GamePlayer接口 IGamePlayer场景类 Clientpublic GamePlayerProxy(String name){//通过代理类的构造函数传递对谁进行代理    gamePlayer = new GamePlayer(this,name);    }//被代理类的构造函数,限制谁能构造函数,并且传递姓名public GamePlayer(IGamePlayer gamePlayer,String name){    if(gamePlayer == null){    throw new Exception("不能创建真实角色");    }    this.name = name;}//普通代理的场景类public class  Client{    public static void main(String args[]){        //定义一个代理类,直接访问代理类        IGamePlayer proxy = new GamePlayerProxy("张三");         proxy.method();//用代理类对象开始调用真实对象的方法    }

普通模式下,调用者只知道代理类而不知道真实对象是谁,屏蔽了真实角色的变更对高层模块的影响。真实的代理类想怎么该就怎么该,只要实现了接口中的方法,对高层模块没有任何影响。

强制代理

  1. 直接访问真实角色时候,必须通过它的代理类。不能直接访问真实角色。
  2. 实现方法。接口中多一个getProxy()方法;指定要访问真实角色必须通过哪个代理。
修改真实类(被代理类)代码实现public class GameProxy implements IGameProxy{    //我的代理对象是谁    private IGamePlayer proxy =null;    public IGamePlayer getProxy(){         this.proxy = new GamePlayerProxy(this);         return this.proxy;     }     .....}强制代理的场景类 public class client{ public static void main(String args[]){        //定义一个代理类,直接访问代理类        IGamePlayer player = new GamePlayerProxy("张三");         //直接访问真实类,真是类会返回它的代理对象。        //获得指定的代理类        IGamePlayer proxy = player.getProxy();        proxy.method();//用代理类对象开始调用真实对象的方法    }

强制代理就是要从真实角色查找代理角色,不允许直接访问真实角色。高层模块只有调用getProxy方法就可以拿到真实角色指定的代理类,然后访问真实角色的所有方法。

动态代理
http://www.cnblogs.com/chinajava/p/5880870.html
http://rejoy.iteye.com/blog/1627405

0 0
原创粉丝点击