给某一对象提供一个代理对象,并由代理对象控制原对象的引用。
2、模型
代理模式所涉及的角色有:
抽象主题角色:声明了真实主题和代理主题的共同接口。
代理主题角色:内部含有对真实主题的引用,可以操作真实主题对象;
代理主题角色提供和真实主题角色相同的接口,可以代替真实主题角色;
代理主题角色被调用传递给真实主题角色之前和之后都要执行某个操作,这样才发挥了代理的作用。
真实主题角色:定义了代理角色所代表的真实数据。
(1)、共同的接口
public interface Subject
{
void Request1(object o);
void Request2(object o);
// ... 其他方法...
}
(2)、真正的类,实现Subject接口,接口和代理类发生联系
public class RealObjectClass : Subject
{
public void Request1(object o)
{
Console.WriteLine("真正的类-方法1!");
}
public void Request2(object o)
{
Console.WriteLine("真正的类-方法2!");
}
}
(3)、代理类,也实现共同接口
public class Proxy : Subject
{
RealObjectClass roc;
public Proxy(RealObjectClass ro)
{
roc = ro;
}
public void Request1(object o)
{
roc.Request1(null);
}
public void Request2(object o)
{
roc.Request2(null);
}
}
调用
static void Main(string[] args)
{
RealObjectClass ro = new RealObjectClass();
Proxy pr = new Proxy(ro);
//所有方法让代理去完成
pr.Request1(null);
pr.Request2(null);
Console.ReadLine();
}
结果
3、代理的种类
远程(Remote)代理:为一个位于不同的地址空间的对象提供一个局域代表对象。这个不同的地址空间可以是在本机器中,也可是在另一台机器中。远程代理又叫做大使(Ambassador)。
虚拟(Virtual)代理:根据需要创建一个资源消耗较大的对象,使得此对象只在需要时才会被真正创建。
Copy-on-Write代理:虚拟代理的一种。把复制(克隆)拖延到只有在客户端需要时,才真正采取行动。
保护(Protect or Access)代理:控制对一个对象的访问,如果需要,可以给不同的用户提供不同级别的使用权限。
Cache代理:为某一个目标操作的结果提供临时的存储空间,以便多个客户端可以共享这些结果。
防火墙(Firewall)代理:保护目标,不让恶意用户接近。
同步化(Synchronization)代理:使几个用户能够同时使用一个对象而没有冲突。
智能引用(Smart Reference)代理:当一个对象被引用时,提供一些额外的操作,比如将对此对象调用的次数记录下来等。
其中,虚拟(Virtual)代理、远程(Remote)代理、智能引用代理(Smart Reference Proxy)和保护(Protect or Access)代理是最为常见的代理模式。
远程代理,比如.NET中的WebService;虚拟代理,类似于QQ相册当点击目录时页面显示了所有图片的缩略图,虚拟代理读取的图片大小和尺寸,当点某一张图片时还是需要下载某一张图片。不过QQ相册不知道是不是代理模式处理的。
我觉得代理模式好处是,对外提供接口不让客户端直接对真是对象操作,可以起到保护作用。也可以利用代理进行一些条件判断等。不过使用的时候应该考虑这个需求是否经常改变,如果改变的话接口、代理、真实类都要修改,不太符合开放封闭原理。