中介者模式
中介者模式定义
中介者模式(Mediator),用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变他们之间的交互。
中介者模式结构图
中介者模式结构图如下所示:

图 01 中介者模式结构图
中介者模式套用代码
1 #include "iostream" 2 using namespace std; 3 #include <string> 4 5 class Colleague; 6 // 中介者抽象接口 7 class Mediator 8 { 9 public: 10 virtual void Send(string message, Colleague* colleague) = 0; 11 }; 12 13 class Colleague 14 { 15 protected: 16 Mediator* mediator; 17 public: 18 Colleague(Mediator* mediator) 19 { 20 this->mediator = mediator; 21 } 22 }; 23 24 // 同事1 25 class ConcreteColleague1 : public Colleague 26 { 27 public: 28 ConcreteColleague1(Mediator* mediator) 29 : Colleague(mediator) 30 { 31 32 } 33 34 void Send(string message) 35 { 36 mediator->Send(message, this); 37 } 38 39 void Notify(string message) 40 { 41 cout << "同事1得到信息: " << message << endl; 42 } 43 }; 44 45 // 同事2 46 class ConcreteColleague2 : public Colleague 47 { 48 public: 49 ConcreteColleague2(Mediator* mediator) 50 : Colleague(mediator) 51 { 52 53 } 54 55 void Send(string message) 56 { 57 mediator->Send(message, this); 58 } 59 60 void Notify(string message) 61 { 62 cout << "同事2得到信息: " << message << endl; 63 } 64 }; 65 66 // 具体中介者类 67 class ConcreteMediator : public Mediator 68 { 69 private: 70 ConcreteColleague1* colleague1; 71 ConcreteColleague2* colleague2; 72 public: 73 void SetConcreteColleague1(ConcreteColleague1* colleague1) 74 { 75 this->colleague1 = colleague1; 76 } 77 78 void SetConcreteColleague2(ConcreteColleague2* colleague2) 79 { 80 this->colleague2 = colleague2; 81 } 82 83 virtual void Send(string message, Colleague* colleague) 84 { 85 if(colleague == colleague1) 86 { 87 colleague2->Notify(message); 88 } 89 else 90 { 91 colleague1->Notify(message); 92 } 93 } 94 }; 95 96 void main() 97 { 98 ConcreteMediator* m = new ConcreteMediator(); 99 100 ConcreteColleague1* c1 = new ConcreteColleague1(m); 101 ConcreteColleague2* c2 = new ConcreteColleague2(m); 102 103 m->SetConcreteColleague1(c1); 104 m->SetConcreteColleague2(c2); 105 106 c1->Send("听过饭了吗?"); 107 c2->Send("没有呢,你打算请客?"); 108 109 delete m; 110 m = NULL; 111 delete c1; 112 c1 = NULL; 113 delete c2; 114 c2 = NULL; 115 }
中介者模式特点
① 尽管一个系统分割成许多对象通常可以增加其可用性,但是对象间相互连接的激增又会降低其可复用性了,因为大量的连接使得一个对象不可能在没有其他对象的支持下工作,系统表现为一个不可分割的整体,所以,对系统的行为进行任何较大的改动就十分困难了。
② 中介者模式很容易在系统中应用,也很容易在系统中误用,当系统出现了“多对多”交互复杂的对象群时,不要急于使用中介者模式,而要先反思你的系统在设计上是不是合理。
③ Mediator的出现减少了各个Colleague的后河,使得可以独立地改变和复用各个Colleague类和Mediator类,比如任何国家的改变不会影响到其他国家,而只是与安理会发生变化。其次,由于把对象如何协调进行了抽象,将中介作为一个独立的概念并将其封装在一个对象中,这样关注的对象就从对象各自本身的行为转移到他们之间的交互上来,也就是站在一个更宏观的角度去看待系统。
④ 由于ConcreteMediator控制了集中化,于是就把交互复杂性变为了中介者的复杂性,这就使得中介者会变得比任何一个ConcreteColleague都复杂。
⑤ 中介者模式一般应用与一组对象以定义良好但是复杂的方式进行通信的场合,以及想定制一个分部在多个类中的行为,而不像生成太多的子类的场合。
中介者模式实例应用
中介者模式实例应用类图

图 02 中介者模式实例应用类图
中介者模式实例应用代码
1 #include "iostream" 2 using namespace std; 3 #include <string> 4 5 class CCountry; 6 // 联合国机构接口 7 class CUnitedNations 8 { 9 public: 10 virtual void Declare(string message, CCountry* colleague) = 0; 11 }; 12 13 // 国家接口 14 class CCountry 15 { 16 protected: 17 CUnitedNations* mediator; 18 public: 19 CCountry(CUnitedNations* mediator) 20 { 21 this->mediator = mediator; 22 } 23 }; 24 25 class CUSA : public CCountry 26 { 27 public: 28 CUSA(CUnitedNations* mediator) 29 : CCountry(mediator) 30 { 31 32 } 33 34 void Declare(string message) 35 { 36 this->mediator->Declare(message, this); 37 } 38 39 void GetMessage(string message) 40 { 41 cout << "美国获对方信息:" << message << endl; 42 } 43 }; 44 45 // 伊拉克 46 class CIraq : public CCountry 47 { 48 public: 49 CIraq(CUnitedNations* mediator) 50 : CCountry(mediator) 51 { 52 53 } 54 55 void Declare(string message) 56 { 57 this->mediator->Declare(message, this); 58 } 59 60 void GetMessage(string message) 61 { 62 cout << "伊拉克获对方信息:" << message << endl; 63 } 64 }; 65 66 // 联合国安全理事会 67 class CUniteNationSecurityCouncil : public CUnitedNations 68 { 69 private: 70 CUSA* colleague1; 71 CIraq* colleague2; 72 public: 73 // 获得CUSA类对象 74 void SetCUSAColleague(CUSA* colleague1) 75 { 76 this->colleague1 = colleague1; 77 } 78 79 // 获得CIraq类对象 80 void SetCIraqColleague(CIraq* colleague2) 81 { 82 this->colleague2 = colleague2; 83 } 84 85 virtual void Declare(string message, CCountry* colleague) 86 { 87 if(colleague == colleague1) 88 { 89 colleague2->GetMessage(message); 90 } 91 else 92 { 93 colleague1->GetMessage(message); 94 } 95 } 96 }; 97 98 void main() 99 { 100 CUniteNationSecurityCouncil* UNSC = new CUniteNationSecurityCouncil(); 101 102 CUSA* usa = new CUSA(UNSC); 103 CIraq* iraq = new CIraq(UNSC); 104 105 UNSC->SetCUSAColleague(usa); 106 UNSC->SetCIraqColleague(iraq); 107 108 usa->Declare("不准研制核武器,否则要发动战争"); 109 iraq->Declare("我们没有核武器,也不怕侵略"); 110 111 delete UNSC; 112 UNSC = NULL; 113 delete usa; 114 usa = NULL; 115 delete iraq; 116 iraq = NULL; 117 }
2014-12-07 21:54:25
浙公网安备 33010602011771号