1.意图
为其他对象提供一种代理以控制对这个对象的访问。
2.结构与参与者
3.动机
对一个对象进行访问控制的一个原因是为了只有在我们确实需要这个对象时才对它进行创建和初始化。我们考虑一个可以在文档中嵌入图形对象的文档编辑器。有些图形对象的开箱很大。但是打开文档必须很迅速,因此我们在打开文档时应避免一次性创建所有开销很大的对象。因为并非所有这些对象在文档中都同时可见,所以也没有必要同时创建这些对象。
4.适用性
1)远程代理
为一个对象在不同的地址空间提供局部代表。
2)虚代理
根据需要创建开销很大的对象。
3)保护代理
控制对原始对象的访问。保护代理用于对象应该有不同的访问权限的时候。
4)智能指引
取代了简单的指针。当调用真实对象时,代理处理另外一些事
5.效果
Proxy模式在访问对象时引入了一定程度的间接性。根据代理的类型,附加的间接性有多重用途:
1)远程代理可以应酬一个对象那个存在于不同地址空间的事实。
2)虚代理可以进行优化,例如根据需要创建对象。
3)保护代理和智能指引都允许在访问一个对象时有一些附加的内务处理。
Proxy模式还可以对用户隐藏另一种称之为copy-on-write的优化方法,该优化与根据需要创建对象有关。拷贝一个庞大而复杂的对象收益中开销很大的操作,如果这个拷贝根本没有被修改,那么这些开销就没有必要。用代理延迟这一拷贝过程,我们可以保证只有当这个对象那个被修改的时候才对它进行拷贝。
6.代码示例
#include <string>
#include <iostream>
using namespace std;
//定义接口
class Interface
{
public:
virtual void Request()=0;
};
//真实类
class RealClass : public Interface
{
public:
virtual void Request()
{
cout<<"真实的请求"<<endl;
}
};
//代理类
class ProxyClass : public Interface
{
private:
RealClass* m_realClass;
public:
virtual void Request()
{
m_realClass= new RealClass();
m_realClass->Request();
delete m_realClass;
}
};
//客户端:
int main()
{
ProxyClass* test=new ProxyClass();
test->Request();
return 0;
}