十五.结构型设计模式——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模式的分类就是它可以应用的情景。