2009年4月8日星期三

JavaDesign_011:代理模式 Proxy(摘录+整理)

1. 特点
(1)为某个对象提供一个代理对象,要访问这个对象,必须通过代理对象,不可以直接访问。
(2)不可以直接访问的原因要么是这个对象不允许直接访问(比如先要进行权限检查);要么是这个对象无法直接访问(比如没有提供一些功能)。

2. 代理的种类
(1)远程代理
隐藏网络细节,使用者感觉不到网络的存在(仿佛是本地调用),代理承担了所有网络通信工作。

(2)虚拟代理
比如某个文档中有个大图片,为了能够迅速地打开文档,在大图片装载完成之前,在其位置用一个图片Proxy来代替。
(3)Copy-on-Write 代理比如某个耗时操作要遍历一个很大的Collection,在此过程中很可能被其它对象修改,而如果使用锁机制,则其它对象均不可修改此Collection。此时,可以“克隆”该Collection供耗时操作使用,不过该“克隆”将延迟到其它对象修改了这个Collection才开始,否则直接对原Collection进行耗时操作。
(4)保护代理
在运行时对调用真实对象的用户的权限进行检查,通过后才可以调用真实的对象。
(5)Cache 代理(6)防火墙代理(7)同步代理(8)智能引用代理
调用真实对象时,做些“内部处理”,比如计数等。

3. 代码架构(1)抽象类或接口
(2)真实类。继承抽象类或实现接口。
(3)代理类。继承抽象类或实现接口。含有真实类的引用。在调用真实类的方法之前、之后都要执行某个操作。
4. Java对代理模式的支持(1)java.lang.reflect.Proxy 运行时创建代理对象。
(2)java.lang.reflect.InvocationHandler 对原对象的方法调用会首先分派给调用处理器,在invoke()方法中截获
(3)java.lang.reflect.Method 调用原对象的方法

5. 典型应用场景(1)股票查询系统。(保护代理:根据权限访问;智能引用代理:按查询次数收费)
(2)延迟加载大型图片。(虚拟代理:图片位置显示“正在加载...”,同时用另一个线程加载图片,加载完毕后,把“正在加载...”替换为图片)
此案例中的大型图片可以延伸为大型软件模块,道理是一样的。

参考文献:
1. 《设计模式》 板桥里人
2. 《Java与模式》 阎宏

没有评论: