现在的位置: 首页 > 综合 > 正文

设计模式:Proxy模式

2013年08月04日 ⁄ 综合 ⁄ 共 1574字 ⁄ 字号 评论关闭

Proxy(代理),字面意思很容易理解,简单来说,找个中间人来帮助完成某事情。从设计上来看,Proxy模式也是一个比较容易理解的模式。但是它有哪些种类,哪些优缺点,和其他的一些模式有什么区别呢?这就需要稍微的详细了解一下了。



 

定义

 

为其他对象提供一种代理以控制对这个对象的访问。



 

分类

 

按照使用目的来划分,代理有以下八种:
远程 (Remote)代理

:为一个位于不同的地址空间的对象提供一个局域代表对象。这个不同的地址空间可以是在本机器中,亦可是在另一台机器中。远程代理又叫做大使(Ambassador)。
虚拟(Virtual)代理

:根据需要创建一个资源消耗较大的对象,使得此对象只在需要时才会被真正创建。本章下面给出一个加载图像的例子说明虚拟代理的使用。
Copy- on-Write代理

:虚拟代理的一种。把复制(克隆)拖延到只有在客户端需要时,才真正采取行动。
保护(Protect or Access)代理

:控制对一个对象的访问,如果需要可以给不同的用户提供不同级别的使用权限。
Cache代理

:为某一个目标操作的结果提供临时的储存空间,以便多个客户端可以共享这些结果。
防火墙(Firewall)代理

:保护目标,不让恶意用户接近。
同步化(Synchronization)代理

:使几个用户能够同时使用一个对象而没有冲突。
智能引用 (Smart Reference)代理

:当一个对象被引用时,提供一些额外的操作,比如将对此对象调用的次数记录下来等。

在所有种类的代理模式中,虚拟(Virtual)代理、远程(Remote)代理、智能引用代理(Smart Reference Proxy)和保护(Protect or Access)代理是最为常见的代理模式种类。



 

图示

 

图一

Proxy Pattern

这里有两点关键点:

1.

Proxy和
RealSubject必须实现同一个Interface或者继承同一个父类

   只有这样,才能保证Client能够把Proxy类的示例当成是RealSubject的实例来用。

2. Proxy要持有RealSubject对象



 

应用示例

 

其实,在之前的分类中已经大致描述了一些常见的应用。

如有一些操作是需要具有相应的权限才能进行,这时候对包含这部分操作的类增加一个代理,由代理来完成相应的权限控制部分就是一个很合理的方案。

又如,有些类的部分操作需要加载资源占用较大的对象,而另外一些操作不需要。那我们就可以使用代理,只有当调用到那部分需要加载资源的操作时,才去加载资源,否则就不加载任何资源。



 

与其他模式区别

 

与Decorator模式的区别

拿掉具体的方法之后来看,Decorator模式和Proxy模式的基本设计图可以说是一模一样,而且都是对某一个对象的一个模拟。那么它们有什么不同呢?

Decorator模式是要对原对象的功能进行增强,而Proxy模式一般只是对原对象的使用进行控制,并不会增加原对象的任何功能。



 

另外一种实现

 

图二

Proxy Pattern (IoC)

之前图一中示例的是一种静态代理,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

抱歉!评论已关闭.