代理(Proxy)模式

代理(Proxy)模式

ID:37248188

大小:224.00 KB

页数:8页

时间:2019-05-20

代理(Proxy)模式_第1页
代理(Proxy)模式_第2页
代理(Proxy)模式_第3页
代理(Proxy)模式_第4页
代理(Proxy)模式_第5页
资源描述:

《代理(Proxy)模式》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、C#设计模式(13)-ProxyPattern一、 代理(Proxy)模式代理(Proxy)模式给某一个对象提供一个代理,并由代理对象控制对原对象的引用。代理模式的英文叫做Proxy或Surrogate,中文都可译成"代理"。所谓代理,就是一个人或者一个机构代表另一个人或者另一个机构采取行动。在一些情况下,一个客户不想或者不能够直接引用一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。二、 代理的种类如果按照使用目的来划分,代理有以下几种:远程(Remote)代理:为一个位于不同的地址空间的对象提供一个局域代表对象。这

2、个不同的地址空间可以是在本机器中,也可是在另一台机器中。远程代理又叫做大使(Ambassador)。虚拟(Virtual)代理:根据需要创建一个资源消耗较大的对象,使得此对象只在需要时才会被真正创建。Copy-on-Write代理:虚拟代理的一种。把复制(克隆)拖延到只有在客户端需要时,才真正采取行动。保护(ProtectorAccess)代理:控制对一个对象的访问,如果需要,可以给不同的用户提供不同级别的使用权限。Cache代理:为某一个目标操作的结果提供临时的存储空间,以便多个客户端可以共享这些结果。防火墙(Firewall)

3、代理:保护目标,不让恶意用户接近。同步化(Synchronization)代理:使几个用户能够同时使用一个对象而没有冲突。智能引用(SmartReference)代理:当一个对象被引用时,提供一些额外的操作,如将对此对象调用的次数记录下来等。在所有种类的代理模式中,虚拟(Virtual)代理、远程(Remote)代理、智能引用代理(SmartReferenceProxy)和保护(ProtectorAccess)代理是最为常见的代理模式。三、 远程代理的例子Achilles是一个用来测试网站的安全性能的工具软件。Achilles相当

4、于位于客户端的的一个桌面代理服务器,在一个HTTP过程里起到一个中间人的作用,但是Achilles与通常的代理服务器又有不同。Achilles截获双向的通信数据,使得Achilles软件的用户可以改变来自和发往网络服务器的数据,甚至可以拦截并修改SSL通讯。(这点在《Java与模式》中解释的不是很清楚,关于对非对称密钥加密拦截、破解方法,可以参考我的另外一篇文章《通过代理截取并修改非对称密钥加密信息》)。另外一个例子就是Windows的快捷方式。快捷方式是它所引用的程序的一个代理。四、 代理模式的结构代理模式的类图如下图所示:代理

5、模式所涉及的角色有:抽象主题角色(Subject):声明了真实主题和代理主题的共同接口,这样一来在任何使用真实主题的地方都可以使用代理主题。代理主题(Proxy)角色:代理主题角色内部含有对真实主题的引用,从而可以在任何时候操作真实主题对象;代理主题角色提供一个与真实主题角色相同的接口,以便可以在任何时候都可以替代真实主体;控制真实主题的应用,负责在需要的时候创建真实主题对象(和删除真实主题对象);代理角色通常在将客户端调用传递给真实的主题之前或之后,都要执行某个操作,而不是单纯的将调用传递给真实主题对象。真实主题角色(RealS

6、ubject)角色:定义了代理角色所代表的真实对象。五、 代理模式示例性代码以下示例性代码实现了代理模式:// Proxy pattern -- Structural example  using System;// "Subject"abstract class Subject{  // Methods  abstract public void Request();}// "RealSubject"class RealSubject : Subject{  // Methods  override public void Re

7、quest()  {    Console.WriteLine("Called RealSubject.Request()");  }}// "Proxy"class Proxy : Subject{  // Fields  RealSubject realSubject;  // Methods  override public void Request()  {    // Uses "lazy initialization"    if( realSubject == null )      realSubject = ne

8、w RealSubject();    preRequest();    realSubject.Request();    postRequest();  }  public void preRequest()  { Console.WriteL

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。