/**********************************************************************************************************/
* 作者:一雨田(http://blog.csdn.net/dylgsy/)。本文可随便转贴,但请保留此信息
* Proxy 模式:代理模式,顾名思义就是代我们处理一些事情,我们不用全部事情都亲力亲为。
* 在编程层面去理解:设置代理,就是在必要的时候再把客户的请求转发给真正的实体。现实中的例子有很多,比如代理服
* 务器,代理服务器在本地存储了很多的信息,我们访问它的时候就好象是在访问真的服务器一样,如果我们需要访问的信
* 息代理服务器上没有,那它就会自动去连接真服务器,到那去取得新的信息,然后再保存在本地,而这一切都是我们的代
* 理自动去做的,我们根本就不用知道(对客户来说,好象是在访问真的服务器。而对真服务器,可减轻了一部份的负担)。
/**********************************************************************************************************/
UML示意图如下:
/**********************************************************************************************************/
* 实例说明:
* 买房子需要办一堆的手续,我们不想那么烦,所以找房屋代理来帮我们搞手续(中介)
/**********************************************************************************************************/
using namespace std;
// 先定义一个抽象类
class CSubject
... {
public:
// 定义买房的操作
virtual void BuyRoom() = 0;
bool m_bDone;
} ;
// 定义买方的类,派生于CSubject
class CBuyer: public CSubject
... {
public:
CBuyer()
...{
m_bDone = false;;
}
virtual void BuyRoom()
...{
if( !m_bDone)
...{
// 客户对买房子的概念是,我只管掏钱,不想管其他的琐事
cout << "我是客户,我只需要给钱。" << endl;
cout << "手续没办,想给钱都不行" << endl;
cout << endl;
}
else
...{
cout << "我是客户,我只需要给钱。" << endl;
cout << "好吧,你的手续已经全部办好。房子买下来了。" << endl;
cout << endl;
}
}
} ;
// 定义代理的类,派生于CSubject
// 代理类有一个买方的引用,便于在适当的时间调用买方的函数
class CBuyerProxy: public CSubject
... {
public:
CBuyerProxy(CSubject *s)
...{
_s = s;
}
virtual void BuyRoom()
...{
cout << "我是中介:贷款";
cout << " 交税";
cout << " 签合同" << endl;
cout << " 我只管办手续,钱就要靠买方给了,所以这里调用买方的函数" << endl;
_s->m_bDone = true;
_s->BuyRoom();
}
private:
CSubject *_s;
} ;
void BuyRoom(CSubject * s)
... {
s->BuyRoom();
}
// 使用上面的类来模拟买房子
void main()
... {
CBuyer buyer;
CBuyerProxy buyerProxy(&buyer);
// 不通过中介买房子
BuyRoom(&buyer);
// 通过中介买房子
BuyRoom(&buyerProxy);
}