一:代理模式簡介
專業版描述:為其他對象提供一種代理以控制對這個對象的訪問。
在某些情況下,一個對象不適合或者不能直接引用另一個對象,而代理對象可以在客戶端和目標對象之間起到中介的作用。
戲劇性描述:房產市場不穩定,房價漲了還是漲。隔壁老王要買房,忍痛找到房產中介,中介把房介紹給老王,老王買到中意房。
這個劇情中老王是主角,演繹了一個買房的故事。房產中介是老王的代理,房子是老王的需求對象,由於中介有房產資源,老王又無法直接找到房源,只能找到中介去買房。
二:實踐
老王的故事在程序中得以實現。
1.協議定義:買房協議(BuyRoomDelegate)。只有擁有買房協議才能成為房產中介。
2.代理者:房產中介(RoomDelegate),他繼承買房協議。
3.需要代理者:買房人(BuyRoomPerson),買房需要找代理。
編碼如下:
買房協議(BuyRoomDelegate):
#pragma once #include <functional> //函數定義:完成代理任務后給請求者反饋 typedef std::function<void(bool succeed, std::string msg)> RoomHandleCallback; #pragma region BuyRoomDelegate //買房協議 class BuyRoomDelegate { public: BuyRoomDelegate() {} ~BuyRoomDelegate() {} public: //買房 virtual bool TryBuy(std::string condition, RoomHandleCallback callback) = 0; }; #pragma endregion
房產中介(RoomDelegate):
#pragma region RoomDelegate //房產中介 class RoomDelegate:public BuyRoomDelegate//, public RoomSellerDelegate { public: RoomDelegate() {} ~RoomDelegate() {} public: //實現父類接口 //買房 bool TryBuy(std::string condition, RoomHandleCallback callback); ////賣房 // void Selling(); private: }; #pragma endregion //RoomDelegate.cpp #include "stdafx.h" #include "RoomDelegate.h" bool RoomDelegate::TryBuy(std::string condition, RoomHandleCallback callback) { cout << "中介找房:" << condition << endl; int a = rand() % 2; bool succeed = a == 0;//如果a==0,買房成功 string msg = ""; if (succeed)//成功 { msg = "中介:恭喜啊"; cout << "中介:終於賣出了一套房" << endl; } else { msg = "中介:對不住呀,這條件不好找呀!"; cout << "中介:這條件太難找了。。。" << endl; } if (callback != nullptr) { callback(succeed, msg); } return succeed; }
買房人(BuyRoomPerson):
#pragma once class BuyRoomDelegate; //買房人 class BuyRoomPerson { public: BuyRoomPerson(); ~BuyRoomPerson(); //買房 bool Buy(std::string condition); public: //設置買房代理 void setBuyRoomDelegate(BuyRoomDelegate* buyRoomDelegate) { m_buyRoomDelegate = buyRoomDelegate; } private: //買房代理 BuyRoomDelegate* m_buyRoomDelegate; }; //BuyRoomPerson.cpp #include "stdafx.h" BuyRoomPerson::BuyRoomPerson() { m_buyRoomDelegate = nullptr; } BuyRoomPerson::~BuyRoomPerson() { } bool BuyRoomPerson::Buy(std::string condition) { if (m_buyRoomDelegate != nullptr) { //string condition = "90萬,90平,石家庄裕華區"; //Lambda 表達式 bool succeed = m_buyRoomDelegate->TryBuy(condition, [condition, this/*向表達式傳參,臨時參數、成員參數*/](bool succeed, std::string msg/*參數*/)->void/*返回值類型*/{ if (succeed) { cout<< "買房成功" << condition <<endl; } else { cout << "沒有談妥,買房失敗"<<condition << 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++) { //買房人向中介查詢能否買到指定條件的房子 bool succeed = buyPer->Buy("90萬,90平,石家庄裕華區"); cout << "=============================次數:"<<i<<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
恭喜隔壁老王買到房了!!歡迎各位到老王家圍觀,哈哈哈。