一、定义
代理模式,为其它对象提供一种代理以控制对这个对象的访问。
二、结构图
三、例子
(1)Subject类,定义了RealSubject和Proxy的共用接口,这样在任何使用RealSubject的地方都可以使用Proxy。
class Subject
{
protected:
void Request();
}
(2)RealSubject类,定义Proxy所代表的真实实体。
class RealSubject : Subject
{
public:
void Request
{
cout<<"Real Request";
}
}
(3)Proxy类,保存一个引用使得代理可以访问实体,并提供一个与subject的接口相同的接口,这样代理就可以用来代替实体。
class Proxy : Subject
{
public:
RealSubject realSubject;
void Request()
{
if(realSubject == NULL)
{
realSubject = new RealSubject();
}
realSubject.Request();
}
}
(4)客户端调用
void main()
{
Proxy proxy = new Proxy();
proxy.Request();
}
四、适用场景
(1) 远程代理,为一个对象在不同的地址空间提供局部代表,这样可以隐藏一个对象存在于不同地址空间的事实。
(2) 虚拟代理,根据需要创建开销很大的对象,通过它来存放实例化需要很长时间的真实对象。
(3) 安全代理。用来控制真实对象访问时的权限。
(4) 智能指引。当调用真实的对象时,代理处理另外一些事。
五、特点
需要修改或屏蔽某一个或若干个类的部分功能,复用另外一部分功能,可使用静态代理,若是需要拦截一批类中的某些方法,在方法的前后插入一些一致的操作
六、对比
(1)适配器模式
适配器Adapter为它所适配的对象提供了一个不同的接口。相反,代理提供了与它的实体相同的接口。然而,用于访问保护的代理可能会拒绝执行实体会执行的操作,因此,它的接口实际上可能只是实体接口的一个子集。
(2)装饰器模式
尽管Decorator的实现部分与代理相似,但Decorator的目的不一样。Decorator为对象添加一个或多个功能,而代理则控制对对象的访问。
————————————————————————————————————
参考资料:
1.我所理解的设计模式(C++实现)——代理模式(Proxy Pattern)【http://blog.csdn.net/lcl_data/article/details/8989420】
2.《大话设计模式》
3.设计模式大杂烩(24种设计模式的总结以及学习设计模式的几点建议)http://www.cnblogs.com/zuoxiaolong/p/pattern26.html