定义:为其他对象提供一种代理以控制对这个对象的访问。(Provide a surrogate or placeholder for another object to control access to it )
代码:
#include <iostream>
#include <list>
#include <string>
using namespace std;
class ISubject
{
public:
ISubject(){}
virtual ~ISubject(){}
virtual void Request()=0;
};
class RealSubject:public ISubject
{
public:
RealSubject()
{
}
virtual void Request(){cout<<"RealSubject Request"<<endl;}
};
class Proxy:public ISubject
{
public:
Proxy():m_realSubject(NULL)
{
}
void BeforeDoSomeThing(){cout<<"BeforeDoSomeThing"<<endl;}
void AfterDoSomeThing(){cout<<"AfterDoSomeThing"<<endl;}
virtual void Request()
{
BeforeDoSomeThing();
cout<<"Proxy Request"<<endl;
if(m_realSubject == NULL)
{
m_realSubject = new RealSubject();
}
m_realSubject->Request();
AfterDoSomeThing();
}
private:
ISubject* m_realSubject;
};
int main(void)
{
Proxy *proxy = new Proxy();
proxy->Request();
return 0;
}
运行结果:
常见变体:
1.远程代理。远程组件的客户机应该与网络地址和进程间通信协议屏蔽。
2.保护代理。必须防止越权访问组件。
3.缓存代理。多重本地客户机可以共享远程组件传回的结果。
4.同步代理。必须同步对一个组件的多重同时访问。
5.计数代理。必须防止组件的偶然删除,或者收集使用情况的统计数字。
6.虚拟代理。处理或者装入一个组件的代价是昂贵的,但该组件的部分信息可能就已足够了。
7.防火墙代理。本地客户机应该与外部世界相隔离。