设计模式-代理模式
来源:互联网 发布:分级诊疗 知乎 编辑:程序博客网 时间:2024/05/19 04:06
java学习之路-设计模式-代理模式
参考书籍《设计模式之禅》
代理模式分为两种:静态代理,动态代理
代理模式定义
三个角色
subject抽象主题角色
可以是接口或者抽象类,是一个最普通的业务类型定义。realsubject实现了接口的具体主题角色
这个是被委托类,被代理类,真正的业务逻辑实现者proxy实现了相同接口的代理角色
也叫委托类,代理类,代理模式核心在代理类上。
一个代理类可以代理多个被代理类,因此一个代理类具体代理哪个真实对象应该由具体的场景类决定。
代理模式优点
-职责清晰,高扩展性,智能化
真实的对象就是实现实际的业务逻辑。不用关心其他业务逻辑的实现
静态代理
静态代理分为两种:普通代理,强制代理
普通代理
- 知道代理者的存在,要求客户端只能访问代理角色,而不能访问真实角色。
- 代理类的构造函数
代理类 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();//用代理类对象开始调用真实对象的方法 }
普通模式下,调用者只知道代理类而不知道真实对象是谁,屏蔽了真实角色的变更对高层模块的影响。真实的代理类想怎么该就怎么该,只要实现了接口中的方法,对高层模块没有任何影响。
强制代理
- 直接访问真实角色时候,必须通过它的代理类。不能直接访问真实角色。
- 实现方法。接口中多一个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
- 设计模式-代理模式
- 设计模式-代理模式
- 设计模式-代理模式
- 设计模式--【代理模式】
- 设计模式:代理模式
- 设计模式--代理模式
- 设计模式---代理模式
- 设计模式-代理模式
- 设计模式---代理模式
- 设计模式 代理模式
- 设计模式-【代理模式】
- 设计模式-代理模式
- 设计模式----代理模式
- 设计模式-代理模式
- 设计模式---代理模式
- 设计模式--代理模式
- 设计模式-代理模式
- 设计模式- 代理模式
- POJ1308 Is It A Tree?
- 1004 Let the Balloon Rise【上升气球】题解
- 访问堆中的数据成员-成员指针
- 图像处理中的形态学(三)
- HTML01—互联网原理
- 设计模式-代理模式
- android基础---ViewPager与fragment
- [51NOD] 1442 士兵的旅行 [Dinic][最大流]
- 数据库Mysql和Navicat的安装
- 在构造函数中开辟内存空间
- 展望——量化未来真的能跑赢曾经的历史么?(一)
- Ubuntu14.04 下更新cmake2.8.x至3.2.2
- twitter 雪花算法 golang 实现
- SuperAgent