代理模式

来源:互联网 发布:idea java log4j使用 编辑:程序博客网 时间:2024/06/03 16:28

面临问题:

在面向对象系统中,有些对象由于某种原因(如对象创建的开销大,或者某些操作需要安全控制,或者需要进程外的访问等),直接访问会给使用者、或者系统结构带来很多麻烦。如何在不失去透明操作对象的同时来管理/控制这些对象特有的复杂性?

解决方案:

增加一层间接层是软件开发中常见的解决方式。在某些情况下,一个客户不想或者不能直接引用一个对象,此时可以通过一个称之为“代理”的第三者来实现间接引用。代理对象可以在客户端和目标对象之间起到中介的作用,并且可以通过代理对象去掉客户不能看到的内容和服务或者添加客户需要的额外服务。

代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用。

所谓代理,就是一个人或者一个机构代表另一个人或者另一个机构采取行动。在一些情况下,一个客户不想或者不能够直接引用一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。



Proxy
 保存一个引用使得proxy可以访问实体
 提供一个与Subject的接口相同的接口,这样proxy就可以用来代替实体
 控制对实体的存取,并可能负责创建和删除它
Subject

定义RealSubject和Proxy的共同接口
RealSubject
 定义Proxy所代表的实体

工作方式:

从客户端向代理主题发出请求,代理主题在接到请求的同时,执行了一个PreRequest()操作,然后才把请求传递给真实主题。在真实主题将请求返回后,代理主题又执行了一个PostRequest()操作,才将控制返回给客户端。


典型的代理类实现代码:

public class Proxy implements Subject{private RealSubject realSubject = new RealSubject();public void preRequest(){…...}public void request(){preRequest();realSubject.request();postRequest();}public void postRequest(){……}} 

常见的代理模式有以下几种类型:
 远程(Remote)代理:为一个位于不同的地址空间的对象提供一个本地的代理对象,这个不同的地址空间可以是在同一台主机中,也可是在另一台主机中,远程代理又叫做大使(Ambassador)。
 虚拟(Virtual)代理:如果需要创建一个资源消耗较大的对象,先创建一个消耗相对较小的对象来表示,真实对象只在需要时才会被真正创建。
 Copy-on-Write代理:它是虚拟代理的一种,把复制(克隆)操作延迟到只有在客户端真正需要时才执行。一般来说,对象的深克隆是一个开销较大的操作,Copy-onWrite代理可以让这个操作延迟,只有对象被用到的时候才被克隆。
 保护(Protect or Access)代理:控制对一个对象的访问,可以给不同的用户提供不同级别的使用权限。
 缓冲(Cache)代理:为某一个目标操作的结果提供临时的存储空间,以便多个客户端可以共享这些结果。• 防火墙(Firewall)代理:保护目标不让恶意用户接近。
• 同步化(Synchronization)代理:使几个用户能够同时使用一个对象而没有冲突。

• 智能引用(Smart Reference)代理:当一个对象被引用时,提供一些额外的操作,如将此对象被调用的次数记录下来等


相关的模式:

Adapter与Proxy模式
 二者都把请求转发给目标对象来处理,但实现的接口不一样;
 Adapter模式中适配器为它所适配的对象提供了一个不同的接口,实现兼容客户类的目的;
 而Proxy则提供了与它的实体相同的接口,或其接口的子集(Protection Proxy可能会拒绝执行实体的操作)。


Decorator与Proxy模式
 Decorator的实现和Proxy类似,都提供了到目的对象方法的间接过渡,但目的不同:Decorator对象添加一个或多个功能,而Proxy则控制对对象的访问。
 Proxy 并不实现和目标对象类似的业务功能,而是一些与目标对象功能联系不太紧密的职责,如权限控制、连接服务器、处理异常等, 二者处理不同问题域的问题;
 Decorator对象处理的问题与目标对象处理的问题是同一问题域,目的是增加目标对象的功能。 Decorator动态地为目标对象添加或减少功能,还可递归地装饰目标对象,产生叠加的效果,而Proxy 无此用途。


0 0
原创粉丝点击