
1 #include <iostream>
2 #include <string>
3
4 using namespace std;
5
6 class Colleague;
7
8 class Mediator
9 {
10 public:
11 virtual void Send(string strMessage, Colleague* pstColleague) = 0;
12 };
13
14 class Colleague
15 {
16 public:
17 Colleague(Mediator* pstMediator): m_pstMediator(pstMediator)
18 {
19
20 }
21
22 virtual void Send(string strMes) = 0;
23
24 virtual void Notify(string strMes) = 0;
25
26 protected:
27 Mediator* m_pstMediator;
28 };
29
30 class ConcreteColleagueA: public Colleague
31 {
32 public:
33 ConcreteColleagueA(Mediator* pstMediator):Colleague(pstMediator)
34 {
35
36 }
37
38 virtual void Send(string strMsg)
39 {
40 m_pstMediator->Send(strMsg, this);
41
42 }
43
44 virtual void Notify(string strMes)
45 {
46 cout<< "同事1得到消息: "<< strMes<< endl;
47 }
48 };
49
50 class ConcreteColleagueB: public Colleague
51 {
52 public:
53 ConcreteColleagueB(Mediator* pstMediator):Colleague(pstMediator)
54 {
55
56 }
57
58 virtual void Send(string strMsg)
59 {
60 m_pstMediator->Send(strMsg, this);
61
62 }
63
64 virtual void Notify(string strMes)
65 {
66 cout<< "同事2得到消息: "<< strMes<< endl;
67 }
68 };
69
70 class ConcreteMediator: public Mediator
71 {
72 public:
73 void SetColleagueA(ConcreteColleagueA* pstColleague)
74 {
75 m_pstColleagueA = pstColleague;
76 }
77
78 void SetColleagueB(ConcreteColleagueB* pstColleague)
79 {
80 m_pstColleagueB = pstColleague;
81 }
82
83 virtual void Send(string strMes, Colleague* pstColleague)
84 {
85 if (pstColleague == m_pstColleagueA)
86 {
87 m_pstColleagueB->Notify(strMes);
88 }
89 else
90 {
91 m_pstColleagueA->Notify(strMes);
92 }
93 }
94
95 private:
96 ConcreteColleagueA* m_pstColleagueA;
97 ConcreteColleagueB* m_pstColleagueB;
98 };
99
100 int main(int argc, char* argv[])
101 {
102 ConcreteMediator* pstMediatorA = new ConcreteMediator();
103
104 ConcreteColleagueA* pstColleagueA = new ConcreteColleagueA(pstMediatorA);
105 ConcreteColleagueB* pstColleagueB = new ConcreteColleagueB(pstMediatorA);
106
107 pstMediatorA->SetColleagueA(pstColleagueA);
108 pstMediatorA->SetColleagueB(pstColleagueB);
109
110
111 pstColleagueA->Send("How are you?");
112 pstColleagueB->Send("I am fine, Thank You!");
113
114 return 0;
115 }
116 ////////////////////////////////////////////
117 [root@ ~/learn_code/design_pattern/21_mediator]$ ./mediator
118 同事2得到消息: How are you?
119 同事1得到消息: I am fine, Thank You!