//4.代理模式 //ver1 //被追求者類 class SchoolGirl { private: string _name; public: SchoolGirl(){} SchoolGirl(string name) { _name = name; } string GetName() { return _name; } void SetName(string name) { _name = name; } }; //接口函數類 class GiveGift { public: GiveGift(){} //Interface virtual void GiveToy() { //... } virtual void GiveFlower() { //... } }; //追求者類 class Pursuit : public GiveGift { private: SchoolGirl _mm; public: Pursuit(SchoolGirl mm) { _mm = mm; } void GiveToy() { _mm.GetName(); // + 送你玩具 } void GiveFlower() { _mm.GetName(); // + 送你花 } }; //代理類 //代理也去實現 "送禮物" 的接口 class Proxy : public GiveGift { private: Pursuit *pps; public: Proxy(SchoolGirl mm) { pps = new Pursuit(mm); } void GiveFlower() { pps->GiveFlower(); //在實現方法中去調用"追求者"類的相關方法; } void GiveToy() { pps->GiveToy(); } }; void main1() { SchoolGirl mm("ysl"); Proxy *pp1 = new Proxy(mm); pp1->GiveFlower(); //SchoolGirl不認識Pursuit,但能夠經過Proxy獲得禮物。 pp1->GiveToy(); } //代理模式: 爲其餘對象提供一種代理以控制對這個對象的訪問.
//4.代理模式 //ver2 //Subject: 定義了 RealSubject 和 Proxy 的共用接口。這樣在任何使用 RealSubject的地方均可以使用Proxy class Subject { public: virtual void Request() = 0; }; //RealSubject: 定義Proxy所表明的真實實體。 class RealSubject : public Subject { public: virtual void Request() { //真實請求 } }; //Proxy: 保存一個引用使得代理能夠訪問實體。 class Proxy : public Subject { private: RealSubject *rs; public: virtual void Request() { if (rs == NULL) { rs = new RealSubject(); } rs->Request(); } }; void main2() { Proxy *pp1 = new Proxy(); pp1->Request(); }
//代理模式場合:
//一.遠程代理。也就是爲一個對象在不一樣的地址空間提供局部表明。這樣能夠隱藏一個對象存在於不一樣地址空間的事實。
//二.虛擬代理。是根據須要建立開銷很大的對象。經過它來存放實例化須要很長時間的真實對象。
//三.安全代理。用來控制真實對象訪問時的權限。
//四.智能指引。當調用真實的對象時,代理處理另一些事。安全