十五.结构型设计模式——Proxy Pattern(代理模式)

  • 定义

  为其他对象提供一个代理或地方以控制对这个对象的访问。当客户向proxy对象第一次提出请求时,proxy实例化真实的对象,并且将请求传给它,以后所有的客户请求都经由proxy传给封装了的真实对象。

  proxy模式分为4种,用得最多的是远程和虚拟代理模式:

  1. Virtual Proxy(虚拟代理):Proxy不会生成一个真实的耗费代理,直到非常必要时(首次有请求)。它用来存放花费大(实例需要很长时间)的真实对象。

  2. Remote Proxy(远程代理):本地的代理对象控制一个远程的对象。

  3. Protection Proxy(安全代理):代理检查调用真实对象所需要的权限。

  4. Smart Reference(聪明引用):当调用真实的对象时,代理处理另外一些事。

    (1). 计算真实对象的引用次数,在没有引用时自动释放。

    (2). 首次被引用时装载存留(保存在硬盘或内存、数据库等)的对象。

    (3). 在访问时检查真实对象是否锁定,确保没有其他对象会改变它。

  UML类图如下:

  

  其中的类和对象的关系为:

  1. Proxy(代理):维护一个引用使得代理可以访问实体,如果RealSubject和Subject的接口相同,Proxy会引用Subject;提供一个与Subject的接口相同的接口,使得代理可以用来代替实体。有点想Adapter模式;控制对实体的访问并且负责创建及删除它;其他功能取决于Proxy的类型。

    * 远程代理:负责对请求及其参数进行编码,向不同的地址空间中的实体发送已编码的请求。

    * 虚拟代理:可以缓存实体的其他信息,以便延迟对它的访问。

    * 保护代理:检查调用者的请求是不是有所必需的权限。

  2. Subject(抽象实体接口):为RealSubject实体及Proxy代理定义相同的接口,使得RealSubject在任何地方都可以使用Proxy来访问。

  3. RealSubject(实体):定义Proxy代理的实体。

  典型应用的顺序图如下:

  

  • 实例1——数学代理

  下面的例子就是应用远程代理来访问另外一个应用程序域中的对象。

  UML类图如下:

  

  

代码
//定义接口IMath
public interface IMath
{
double Add(double x, double y);
double Sub(double x, double y);
double Mul(double x, double y);
double Div(double x, double y);
}
//实体,实现两种接口,MarshalByRefObject接口允许不同的程序域(进程间)通信
class Math : MarshalByRefObject, IMath
{
public double Add(double x, double y)
{
return x + y;
}
public double Sub(double x, double y)
{
return x - y;
}
public double Mul(double x, double y)
{
return x * y;
}
public double Div(double x, double y)
{
return x / y;
}
}
//远程代理对象Proxy,包括Math的一个实例,通过它来处理加、减、乘、除
class MathProxy : IMath
{
Math math;
public MathProxy()
{
math
= new Math();
}
public double Add(double x, double y)
{
return math.Add(x, y);
}
public double Sub(double x, double y)
{
return math.Sub(x, y);
}
public double Mul(double x, double y)
{
return math.Mul(x, y);
}
public double Div(double x, double y)
{
return math.Div(x, y);
}
}

//客户应用测试
class Client
{
[STAThread]
static void Main(string[] args)
{
MathProxy p
= new MathProxy();
Console.WriteLine(
"4 + 2 = {0}", p.Add(4, 2));
Console.WriteLine(
"4 - 2 = {0}", p.Sub(4, 2));
Console.WriteLine(
"4 * 2 = {0}", p.Mul(4, 2));
Console.WriteLine(
"4 / 2 = {0}", p.Div(4, 2));
Console.Read();
}
}

 

 

  • 优势和缺陷

  当对象在远程机器上,要通过网络来生成时,速度可能会慢,此时应用Remote Proxy模式,可以掩蔽对象由网络生成的过程,系统的速度会加快;对于大图片的加载,Virtual Proxy模式可以让加载在后台进行,前台用的Proxy对象使得整体运行速度得到优化;Protect Proxy可以验证对真实对象的引用权限。

  代理模式的缺陷是请求的处理速度会变慢,并且实现Proxy模式需要额外的工作。

  • 应用情景

  前面介绍的Proxy模式的分类就是它可以应用的情景。

posted on 2010-11-09 22:18  tLEE  阅读(531)  评论(0编辑  收藏  举报

导航