021 --- 第25章 中介者模式
阿新 • • 發佈:2020-09-11
簡述:
中介者模式:用一箇中介物件來封裝一系列的物件互動。中介者使各個物件不需要顯示地相互引用,從而使其耦合鬆散,而且可以獨立地改變他們之間的互動。
中介者模式包括:抽象中介者類、具體中介者類、抽象同事類、具體同事類。
抽象中介者類:定義了同事物件到中介者物件的介面。
具體中介者類:實現抽象中介者類的方法,它需要知道所有具體同事類,並從具體同事接收訊息,向具體同事物件發出命令。
抽象同事類:抽象介面。
具體同事類:每個具體同事只知道自己的行為,而不連線其他同事類的情況,但它們缺都認識中介者物件。
中介者模式:
1 #include <iostream> 2using namespace std; 3 4 class CMediator; 5 //抽象同事類 6 class CColleague 7 { 8 protected: 9 CMediator* m_pMediator; 10 11 public: 12 CColleague(CMediator* pMediator) { m_pMediator = pMediator; } 13 }; 14 15 // 抽象中介者類 16 class CMediator 17 { 18 public: 19 virtual void Send(string szMessage, CColleague* pColleague) = 0; 20 }; 21 22 // 具體同事類 23 class CConcreteColleague1 : public CColleague 24 { 25 public: 26 CConcreteColleague1(CMediator* pMediator) : CColleague(pMediator) {} 27 28 void Send(string szMessage) { m_pMediator->Send(szMessage, this); } 29 30 void Notify(string szMessage) { cout << "同事1得到訊息" << szMessage << endl; } 31 }; 32 33 // 具體同事類 34 class CConcreteColleague2 : public CColleague 35 { 36 public: 37 CConcreteColleague2(CMediator* pMediator) : CColleague(pMediator) {} 38 39 void Send(string szMessage) { m_pMediator->Send(szMessage, this); } 40 41 void Notify(string szMessage) { cout << "同事2得到訊息" << szMessage << endl; } 42 }; 43 44 // 具體中介者類 45 class CConcreteMediator : public CMediator 46 { 47 private: 48 CConcreteColleague1* m_pColleague1; 49 CConcreteColleague2* m_pColleague2; 50 51 public: 52 void SetColleague1(CConcreteColleague1* pColleague) { m_pColleague1 = pColleague; } 53 54 void SetColleague2(CConcreteColleague2* pColleague) { m_pColleague2 = pColleague; } 55 56 virtual void Send(string szMessage, CColleague* pColleague) 57 { 58 if (pColleague == m_pColleague1) 59 m_pColleague2->Notify(szMessage); 60 else 61 m_pColleague1->Notify(szMessage); 62 } 63 }; 64 65 int main() 66 { 67 CConcreteMediator Mediator; 68 CConcreteColleague1 Colleague1(&Mediator); 69 CConcreteColleague2 Colleague2(&Mediator); 70 71 Mediator.SetColleague1(&Colleague1); 72 Mediator.SetColleague2(&Colleague2); 73 74 Colleague1.Send("吃過飯了嗎?"); 75 Colleague2.Send("沒有,你打算請客?"); 76 77 system("pause"); 78 return 0; 79 }
輸出結果:
例:聯合國打嘴仗
程式碼如下:
1 #include <iostream> 2 using namespace std; 3 4 class CUniteNations; 5 // 國家(抽象同事類) 6 class CCountry 7 { 8 protected: 9 CUniteNations* m_pMediator; 10 11 public: 12 CCountry(CUniteNations* pMediator) { m_pMediator = pMediator; } 13 }; 14 15 // 聯合國(抽象中介者類) 16 class CUniteNations 17 { 18 public: 19 // 宣告 20 virtual void Declare(string szMessage, CCountry* pColleague) = 0; 21 }; 22 23 // 中國(具體同事類) 24 class CChina: public CCountry 25 { 26 public: 27 CChina(CUniteNations* pMediator) : CCountry(pMediator) {} 28 29 // 宣告 30 void Declare(string szMessage) { m_pMediator->Declare(szMessage, this); } 31 32 // 獲得訊息 33 void GetMessage(string szMessage) { cout << "中華人民共和國獲得對方訊息:" << szMessage << endl; } 34 }; 35 36 // 美國(具體同事類) 37 class CUSA : public CCountry 38 { 39 public: 40 CUSA(CUniteNations* pMediator) : CCountry(pMediator) {} 41 42 // 宣告 43 void Declare(string szMessage) { m_pMediator->Declare(szMessage, this); } 44 45 // 獲得訊息 46 void GetMessage(string szMessage) { cout << "萬惡的美帝獲得對方訊息:" << szMessage << endl; } 47 }; 48 49 // 聯合國安全理事會(具體中介者類) 50 class CUniteNationsSecurityCouncil : public CUniteNations 51 { 52 private: 53 CChina* m_pColleague1; 54 CUSA* m_pColleague2; 55 56 public: 57 void SetColleague1(CChina* pColleague1) { m_pColleague1 = pColleague1; } 58 59 void SetColleague2(CUSA* pColleague2) { m_pColleague2 = pColleague2; } 60 61 void Declare(string szMessage, CCountry* pColleague) 62 { 63 if (pColleague == m_pColleague1) 64 m_pColleague2->GetMessage(szMessage); 65 else 66 m_pColleague1->GetMessage(szMessage); 67 } 68 }; 69 70 71 int main() 72 { 73 CUniteNationsSecurityCouncil UNSC; 74 CChina China(&UNSC); 75 CUSA USA(&UNSC); 76 77 UNSC.SetColleague1(&China); 78 UNSC.SetColleague2(&USA); 79 80 USA.Declare("我們要經濟制裁你!"); 81 China.Declare("你們特靠譜是逗比~"); 82 83 USA.Declare("我們要科技制裁你!"); 84 China.Declare("你們特靠譜是逗比~"); 85 86 USA.Declare("我們要全球孤立你!"); 87 China.Declare("你們特靠譜是逗比~"); 88 89 USA.Declare("咱們能不提老特的事麼?"); 90 China.Declare("你們黑白配玩的挺嗨~"); 91 China.Declare("你們疫情控制得好~"); 92 China.Declare("你們有小弟要搞獨立~"); 93 94 USA.Declare("咱還是說老特的事吧。。。"); 95 96 system("pause"); 97 return 0; 98 }
輸出結果: