代理模式(Proxy Pattern)

如果按照使用目的来划分,代理有以下几种:

  • 远程(Remote)代理:为一个位于不同的地址空间的对象提供一个局域代表对象。这个不同的地址空间可以是在本机器中,也可是在另一台机器中。远程代理又叫做大使(Ambassador)。
  • 虚拟(Virtual)代理:根据需要创建一个资源消耗较大的对象,使得此对象只在需要时才会被真正创建。
  • Copy-on-Write代理:虚拟代理的一种。把复制(克隆)拖延到只有在客户端需要时,才真正采取行动。
  • 保护(Protect or Access)代理:控制对一个对象的访问,如果需要,可以给不同的用户提供不同级别的使用权限。
  • Cache代理:为某一个目标操作的结果提供临时的存储空间,以便多个客户端可以共享这些结果。
  • 防火墙(Firewall)代理:保护目标,不让恶意用户接近。
  • 同步化(Synchronization)代理:使几个用户能够同时使用一个对象而没有冲突。
  • 智能引用(Smart Reference)代理:当一个对象被引用时,提供一些额外的操作,比如将对此对象调用的次数记录下来等。

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


三、 远程代理的例子

Achilles是一个用来测试网站的安全性能的工具软件。Achilles相当于位于客户端的的一个桌面代理服务器,在一个HTTP过程里起到一个中间人的作用,但是Achilles与通常的代理服务器又有不同。Achilles截获双向的通信数据,使得Achilles软件的用户可以改变来自和发往网络服务器的数据,甚至可以拦截并修改SSL通讯。(这点在《Java与模式》中解释的不是很清楚,关于对非对称密钥加密拦截、破解方法,可以参考我的另外一篇文章《通过代理截取并修改非对称密钥加密信息》)。

另外一个例子就是Windows的快捷方式。快捷方式是它所引用的程序的一个代理。


四、 代理模式的结构

代理模式的类图如下图所示:

代理模式所涉及的角色有:

抽象主题角色(Subject):声明了真实主题和代理主题的共同接口,这样一来在任何使用真实主题的地方都可以使用代理主题。

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

真实主题角色(RealSubject)角色:定义了代理角色所代表的真实对象。


五、 代理模式示例性代码

以下示例性代码实现了代理模式:

 

//  Proxy pattern -- Structural example  
using  System;

//  "Subject"
abstract   class  Subject
{
  
// Methods
  abstract public void Request();
}


//  "RealSubject"
class  RealSubject : Subject
{
  
// Methods
  override public void Request()
  
{
    Console.WriteLine(
"Called RealSubject.Request()");
  }

}


//  "Proxy"
class  Proxy : Subject
{
  
// Fields
  RealSubject realSubject;

  
// Methods
  override public void Request()
  
{
    
// Uses "lazy initialization"
    if( realSubject == null )
      realSubject 
= new RealSubject();

    preRequest();
    realSubject.Request();
    postRequest();
  }


  
public void preRequest()
  
{ Console.WriteLine("PreRequest."); }

  
public void postRequest()
  
{ Console.WriteLine("PostRequest."); }
}


/**/ /// <summary>
/// Client test
/// </summary>

public   class  Client
{
  
public static void Main( string[] args )
  
{
    
// Create proxy and request a service
    Proxy p = new Proxy();
    p.Request();
  }

}
六、 高老庄悟空降八戒

尽管那时候八戒还不叫八戒,但为了方便,这里仍然这样称呼他。

高老庄的故事

却说那春融时节,悟空牵着白马,与唐僧赶路西行。忽一日天色将晚,远远地望见一村人,这就是高老庄,猪八戒的丈人高太公家。为了将高家三小姐解救出八戒的魔掌,悟空决定扮做高小姐,会一会这个妖怪:

"行者却弄神通,摇身一变,变得就如那女子一般,独自个坐在房里等那妖精。不多时,一阵风来,真个是走石飞砂……那阵狂风过处,只见半空里来了一个妖精,果然生得丑陋:黑脸短毛,长喙大耳,穿一领青不青、蓝不蓝的梭布直裰,系一条花布手巾……走进房,一把搂住,就要亲嘴……"

高家三小姐的神貌和本人

悟空的下手之处是将高家三小姐的神貌和她本人分割开来,这和"开一闭"原则有异曲同工之妙。这样一来,"高家三小姐本人"也就变成了"高家三小姐神貌"的具体实现,而"高家三小姐神貌"则变成了抽象角色,如下图所示。

悟空扮演并代替高家三小姐

悟空巧妙地实现了"高家三小姐神貌",也就是说同样变成了"高家三小姐神貌"的子类。悟空可以扮演高家三小姐,并代替高家三小姐会见八戒,其静态结构图如下图所示。

悟空代替"高家三小姐本人"去会见猪八戒。显然这就是代理模式的应用。具体地讲,这是保护代理模式的应用。只有代理对象认为合适时,才会将客户端的请求传递给真实主题对象。

八戒分辨不出真假老婆

从《西游记》的描述可以看出,猪八戒根本份辨不出悟空扮演的"高家三小姐替身"和 "高家三小姐本人"。客户端分辨不出代理主题对象与真实主题对象,这是代理模式的一个
重要用意。

悟空代替高家三小姐会见八戒的对象图如下图所示。


七、 不同类型的代理模式

远程代理

可以将网络的细节隐藏起来,使得客户端不必考虑网络的存在。客户完全可以认为被代理的对象是局域的而不是远程的,而代理对象承担了大部分的网络通信工作,远程代理的结构图如下图所示。

虚拟代理

使用虚拟代理模式的优点就是代理对象可以在必要的时候才将被代理的对象加载。代理可以对加载的过程加以必要的优化。当一个模块的加载十分耗费资源的时候,虚拟代理的优点就非常明显。

保护代理

保护代理可以在运行时间对用户的有关权限进行检查,然后在核实后决定将调用传递给被代理的对象。

智能引用代理

在访问一个对象时可以执行一些内务处理(Housekeeping)操作,比如计数操作等。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是组合模式、装饰器模式、外观模式、享元模式和代理模式的应用案例和代码实现步骤的简要说明: 1. 组合模式 (Composite Pattern): 应用案例:文件系统的目录结构可以使用组合模式来表示,其中目录和文件都可以作为容器或叶子节点,可以方便地进行递归操作。 代码实现步骤:创建一个抽象类或接口表示组件,其中包含添加、删除和获取子组件的方法。实现类分别表示叶子节点和容器节点,容器节点可以包含其他组件。 2. 装饰器模式 (Decorator Pattern): 应用案例:在一个图形绘制软件中,可以使用装饰器模式来实现不同的图形对象以及对图形进行装饰,例如添加颜色、添加边框等。 代码实现步骤:创建一个抽象类或接口表示基本对象或装饰器,其中包含一个基本对象的引用。具体装饰器类继承自该抽象类,并在调用方法时添加额外的功能。 3. 外观模式 (Facade Pattern): 应用案例:在一个电子商务平台中,可以使用外观模式来创建一个统一的接口,将不同子系统的功能封装起来,便于客户端调用。 代码实现步骤:创建一个外观类,该类提供了一个简单的接口来调用多个子系统的功能,并在内部进行协调和管理。 4. 享元模式 (Flyweight Pattern): 应用案例:在一个游戏中,可以使用享元模式来共享不同的游戏资源对象,例如共享相同的纹理、音频等,以减少内存的使用。 代码实现步骤:创建一个享元工厂类来管理共享对象,通过池化技术来缓存和重用对象,并提供一个获取共享对象的方法。 5. 代理模式 (Proxy Pattern): 应用案例:在一个网络请求中,可以使用代理模式来代表真实的网络请求对象,以进行一些额外的操作,例如鉴权、缓存等。 代码实现步骤:创建一个接口或抽象类来表示真实对象和代理对象,代理对象持有一个真实对象的引用,并在调用方法时进行一些额外的处理。 以上是这些设计模式的简要应用案例和代码实现步骤。在实际开发中,可以根据具体需求选择合适的设计模式,并根据设计模式的原则进行设计和实现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值