Proxy(代理),字面意思很容易理解,简单来说,找个中间人来帮助完成某事情。从设计上来看,Proxy模式也是一个比较容易理解的模式。但是它有哪些种类,哪些优缺点,和其他的一些模式有什么区别呢?这就需要稍微的详细了解一下了。
定义
为其他对象提供一种代理以控制对这个对象的访问。
分类
按照使用目的来划分,代理有以下八种:
远程 (Remote)代理
:为一个位于不同的地址空间的对象提供一个局域代表对象。这个不同的地址空间可以是在本机器中,亦可是在另一台机器中。远程代理又叫做大使(Ambassador)。
虚拟(Virtual)代理
:根据需要创建一个资源消耗较大的对象,使得此对象只在需要时才会被真正创建。本章下面给出一个加载图像的例子说明虚拟代理的使用。
Copy- on-Write代理
:虚拟代理的一种。把复制(克隆)拖延到只有在客户端需要时,才真正采取行动。
保护(Protect or Access)代理
:控制对一个对象的访问,如果需要可以给不同的用户提供不同级别的使用权限。
Cache代理
:为某一个目标操作的结果提供临时的储存空间,以便多个客户端可以共享这些结果。
防火墙(Firewall)代理
:保护目标,不让恶意用户接近。
同步化(Synchronization)代理
:使几个用户能够同时使用一个对象而没有冲突。
智能引用 (Smart Reference)代理
:当一个对象被引用时,提供一些额外的操作,比如将对此对象调用的次数记录下来等。
在所有种类的代理模式中,虚拟(Virtual)代理、远程(Remote)代理、智能引用代理(Smart Reference Proxy)和保护(Protect or Access)代理是最为常见的代理模式种类。
图示
图一
这里有两点关键点:
1.
Proxy和
RealSubject必须实现同一个Interface或者继承同一个父类
只有这样,才能保证Client能够把Proxy类的示例当成是RealSubject的实例来用。
2. Proxy要持有RealSubject对象
应用示例
其实,在之前的分类中已经大致描述了一些常见的应用。
如有一些操作是需要具有相应的权限才能进行,这时候对包含这部分操作的类增加一个代理,由代理来完成相应的权限控制部分就是一个很合理的方案。
又如,有些类的部分操作需要加载资源占用较大的对象,而另外一些操作不需要。那我们就可以使用代理,只有当调用到那部分需要加载资源的操作时,才去加载资源,否则就不加载任何资源。
与其他模式区别
与Decorator模式的区别
拿掉具体的方法之后来看,Decorator模式和Proxy模式的基本设计图可以说是一模一样,而且都是对某一个对象的一个模拟。那么它们有什么不同呢?
Decorator模式是要对原对象的功能进行增强,而Proxy模式一般只是对原对象的使用进行控制,并不会增加原对象的任何功能。
另外一种实现
图二
之前图一中示例的是一种静态代理,Proxy类只是对类RealSubject的代理。而图二中的示例则是一种动态代理。此时的Proxy持有的不再是某个具体的Subject的子类,而仅仅持有Subject接口。这种情况下,我们就可以通过注入的方式来改变Proxy所代理的具体类型。这种方法降低了耦合性,提供了更大的灵活性。
参考资料
1. http://www.microsoft.com/china/community/program/originalarticles/TechDoc/proxymod.mspx
2. http://www.yesky.com/412/1919412.shtml
3. http://lizwjiang.javaeye.com/blog/86389
4. http://www.yesky.com/140/1609140.shtml