<简介>
普通对象所需要完成的任务是通过公共接口为外界提供自己所承诺的服务。然而,有时候合法的对象可能会因为各种原因
而无法完成自己常规的任务。尤其是当对象需要很长时间才能载入内存、对象正运行在另一台计算机上或者需要获取对象
消息的时候,这种情况就会频繁出现。在这种情况下,我们可以使用一个代理对象,由它来承担客户期待的责任,并将请
求转发给其背后的目标对象。
<意图>
为对象提供一个代理或者占位(placeholder)来控制对该对象的访问。
<典型应用RMI>
如果期望调用正在另一台计算机上运行的对象的方法,那么必须找到一种方法来与该远程对象进行通信,而不能直接调用
其方法。我们可以在远程机器上打开一个Socket,并设计一种协议用于向该远程对象发送消息。理想情况下,这种方案可
以让我们自己地与远程对象通信,就像与本地对象通信一样。在这种方案下使用Proxy模式,可直接调用位于本地的代理
对象的方法,该代理对象将调用请求发给远程对象。实际上,著名的公共对象请求代理架构(CORBA)、ASP.NET以及Java
的远程方法调用(RMI)已经实现了这种方案。
在RMI中,代理对象用于将调用请求转发给在另一台计算机上运行的指定对象,客户可以很容易地获得这种代理对象。发论
业界标准如何发展,未来的分布式计算仍将离不开Proxy模式。
<说明>
代理模式充许代理类通过实现与被代理类相同的接口(或提供相同的接口)的方式来使客户间接地访问被代理类的对象,不
论被代理类对象是否可以直接访问或暂时无法访问,代理类对象都可以使得客户“感觉”它就在访问这个对象一样。因为它“
代理”目标对象完成了客户所要求的操作。
<动态代理>
在java中,动态代理技术使我们能够使用代理对象包装其他对象、截获对被包装对象的调用、在调用传递前和传递后增加
其他操作等,这样可以比较随意地给任何对象增加可复用的行为。
<小结>
Proxy模式的实现要求建立一个占位对象,用于控制对目标对象的访问。这样客户端就无需了解目标对象的状态变化。就像
加载一个图像需要耗费一定时间时,我们可以使用Proxy模式改善用户体验。但Proxy模式本身存在代理对象与被代理对象
之间耦合度过紧的问题。在Java中,动态代理有时可以提供一种增加可复用功能的机制。如果某对象的类可实现要截获的接
口,可以使用动态代理包装该对象,增加自己的处理逻辑,以增强或者替换被包装对象代码的功能。