深入浅出设计模式-013:代理模式(Proxy Pattern控制和管理访问)
一:定义
代理模式为另一个对象提供一个替身或占位符以控制对这个对象的访问。
二:代理的种类,按照使用目的划分
1:远程(Remote)代理:
为一个位于不同的地址空间的对象提供一个局域代表对象。这个不同的地址空间可以是在本机器中,也可是在另一台机器中。远程代理又叫做大使(Ambassador)。
2:虚拟(Virtual)代理:
根据需要创建一个资源消耗较大的对象,使得此对象只在需要时才会被真正创建。
3:Copy-on-Write代理:
虚拟代理的一种。把复制(克隆)拖延到只有在客户端需要时,才真正采取行动。
4:保护(Protect or Access)代理:
控制对一个对象的访问,如果需要,可以给不同的用户提供不同级别的使用权限。
5:Cache代理:
为某一个目标操作的结果提供临时的存储空间,以便多个客户端可以共享这些结果。
6:防火墙(Firewall)代理:
保护目标,不让恶意用户接近。
7:同步化(Synchronization)代理:
使几个用户能够同时使用一个对象而没有冲突。
8:智能引用(Smart Reference)代理:
当一个对象被引用时,提供一些额外的操作,比如将对此对象调用的次数记录下来等。
在所有种类的代理模式中,虚拟(Virtual)代理、远程(Remote)代理、智能引用代理(Smart Reference Proxy)和保护(Protect or Access)代理是最为常见的代理模式。
三:结论
代理模式为另一个对象提供代表,以便控制客户对对象的访问,管理访问的方式有许多种。
远程代理管理客户和远程对象之间的交互。
虚拟代理控制访问实例化开销大的对象。
保护代理基于调用者控制对象方法的访问。
代理模式有许多变体,例如缓存代理,同步代理,防火墙代理和写入时复制代理。
代理在结构上类似装饰者,但是目的不同。装饰者模式为对象加上行为,而代理则是控制访问。
四:
abstract class Subject
{
abstract public void Request();
}
class RealSubject : Subject
{
override public void Request()
{
Console.WriteLine("Called RealSubject.Request()");
}
}
class Proxy : Subject
{
RealSubject realSubject;
override public void Request()
{
if( realSubject == null )
realSubject = new RealSubject();
preRequest();
realSubject.Request();
postRequest();
}
public void preRequest()
{
Console.WriteLine("PreRequest.");
}
public void postRequest()
{
Console.WriteLine("PostRequest.");
}
}
public class Client
{
public static void Main( string[] args )
{
Proxy p = new Proxy();
p.Request();
}
}