专业版描述:为其他对象提供一种代理以控制对这个对象的访问。
在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。
戏剧性描述:房产市场不稳定,房价涨了还是涨。隔壁老王要买房,忍痛找到房产中介,中介把房介绍给老王,老王买到中意房。
这个剧情中老王是主角,演绎了一个买房的故事。房产中介是老王的代理,房子是老王的需求对象,由于中介有房产资源,老王又无法直接找到房源,只能找到中介去买房。
老王的故事在程序中得以实现。
1. 协议定义:买房协议(BuyRoomDelegate)。只有拥有买房协议才能成为房产中介。 2. 代理者:房产中介(RoomDelegate),他继承买房协议。
3. 需要代理者:买房人(BuyRoomPerson),买房需要找代理。
编码如下:
买房协议(BuyRoomDelegate):
- #pragmaonce
- #include
- //函数定义:完成代理任务后给请求者反馈typedef std::function<void(boolsucceed, std::stringmsg)> RoomHandleCallback;
- #pragmaregion BuyRoomDelegate//买房协议
- class BuyRoomDelegate
- {
- public:
- BuyRoomDelegate() {}
- ~BuyRoomDelegate() {}
- public:
- //买房
- virtual boolTryBuy(std::stringcondition, RoomHandleCallback callback) =0;
- };
- #pragmaendregion
房产中介(RoomDelegate):
- #pragmaregion RoomDelegate//房产中介
- classRoomDelegate:publicBuyRoomDelegate//, public RoomSellerDelegate
- {
- public:
- RoomDelegate() {}
- ~RoomDelegate() {}
- public:
- //实现父类接口
- //买房
- boolTryBuy(std::string condition, RoomHandleCallback callback);
- ////卖房
- // void Selling();
- private:
- };
- #pragmaendregion//RoomDelegate.cpp#include"stdafx.h"
- #include "RoomDelegate.h"
- boolRoomDelegate::TryBuy(std::string condition, RoomHandleCallback callback)
- {
- cout <<"中介找房:"<< condition << endl;
- inta = rand() %2;
- boolsucceed = a ==0;//如果a==0,买房成功
- stringmsg ="";
- if(succeed)//成功
- {
- msg ="中介:恭喜啊";
- cout <<"中介:终于卖出了一套房"<< endl;
- }
- else
- {
- msg ="中介:对不住呀,这条件不好找呀!";
- cout <<"中介:这条件太难找了。。。"<< endl;
- }
- if(callback != nullptr)
- {
- callback(succeed, msg);
- }
- return succeed;
- }
买房人(BuyRoomPerson):
- #pragmaonceclass BuyRoomDelegate;
- //买房人
- class BuyRoomPerson
- {
- public:
- BuyRoomPerson();
- ~BuyRoomPerson();
- //买房
- boolBuy(std::string condition);
- public:
- //设置买房代理
- voidsetBuyRoomDelegate(BuyRoomDelegate* buyRoomDelegate) { m_buyRoomDelegate = buyRoomDelegate; }
- private:
- //买房代理BuyRoomDelegate* m_buyRoomDelegate;
- };
- //BuyRoomPerson.cpp#include"stdafx.h"
- BuyRoomPerson::BuyRoomPerson()
- {
- m_buyRoomDelegate = nullptr;
- }
- BuyRoomPerson::~BuyRoomPerson()
- {
- }
- boolBuyRoomPerson::Buy(std::string condition)
- {
- if(m_buyRoomDelegate != nullptr)
- {
- //string condition = "90万,90平,石家庄裕华区";
- //Lambda 表达式
- boolsucceed = m_buyRoomDelegate->TryBuy(condition, [condition,this/*向表达式传参,临时参数、成员参数*/](boolsucceed, std::stringmsg/*参数*/)->void/*返回值类型*/{
- if (succeed)
- {
- cout<<"买房成功"<< condition <<endl;
- }
- else
- {
- cout <<"没有谈妥,买房失败"< endl;
- }
- });
- return succeed;
- }
- return false;
- }
测试代码:
- int main()
- {
- //房产中介RoomDelegate* roomDel =new RoomDelegate();
- //买房人BuyRoomPerson* buyPer =new BuyRoomPerson();
- //买房人找个中介帮忙买房buyPer->setBuyRoomDelegate(roomDel);
- for(size_t i =0; i <10; i++)
- {
- //买房人向中介查询能否买到指定条件的房子
- boolsucceed = buyPer->Buy("90万,90平,石家庄裕华区");
- cout <<"=============================次数:"<endl;
- if(succeed)//如果买房成功了,就不买了
- break;
- }
- while(true)
- {
- char a;
- cin >> a;
- }
- }
输出结果:
- 中介找房:90万,90平,石家庄裕华区
- 中介:这条件太难找了。。。
- 没有谈妥,买房失败90万,90平,石家庄裕华区
- =============================次数:0
- 中介找房:90万,90平,石家庄裕华区
- 中介:这条件太难找了。。。
- 没有谈妥,买房失败90万,90平,石家庄裕华区
- =============================次数:1
- 中介找房:90万,90平,石家庄裕华区
- 中介:终于卖出了一套房
- 买房成功90万,90平,石家庄裕华区
- =============================次数:2
恭喜隔壁老王买到房了!!欢迎各位到老王家围观, 哈哈哈。
来源: http://www.cnblogs.com/mengdongsky/p/6876668.html