设计模式:Proxy模式

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值