1. 程式人生 > 實用技巧 >021 --- 第25章 中介者模式

021 --- 第25章 中介者模式

簡述:

  中介者模式:用一箇中介物件來封裝一系列的物件互動。中介者使各個物件不需要顯示地相互引用,從而使其耦合鬆散,而且可以獨立地改變他們之間的互動。

  中介者模式包括:抽象中介者類、具體中介者類、抽象同事類、具體同事類。

    抽象中介者類:定義了同事物件到中介者物件的介面。

    具體中介者類:實現抽象中介者類的方法,它需要知道所有具體同事類,並從具體同事接收訊息,向具體同事物件發出命令。

    抽象同事類:抽象介面。

    具體同事類:每個具體同事只知道自己的行為,而不連線其他同事類的情況,但它們缺都認識中介者物件。

中介者模式:

 1 #include <iostream>
 2
using 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 }

輸出結果: