设计模式之中介者模式

时间:2022-10-01 19:28:22

1、一系列的对象交互。中介者使各对象不需要显示相互引用,从而使其耦合松散,而且可以独立地变化它们之间的交互。

UML图如下:

设计模式之中介者模式


2、中介者模式很容易在系统中应用,也很容易在系统中误用。当系统出现了“多对多”交互复杂的对象群时,不要急于使用中介者模式,而要先反思你的系统在设计上是不是合理。

优点:

首先是Mediator的出现减少了各个Colleague的耦合,使得可以独立地改变和复用各个Colleague类和Mediator,其次由于把对象如何协作进行了抽象,将中介作为一个独立的概念,并将其封装在一个对象中,这样关注的对象就从对象本身的行为转移到它们之间的交互上来,也就是站在一个更宏观的角度去看待系统。

缺点:

由于ConcreteMediator控制了集中化,于是就把复杂性变为了中介者的复杂性,这就使得中介者会比任何一个Colleague都复杂。


3、中介者模式一般应用于一组对象以定义良好但是复杂的方式进行通信的场合,以及想定制一个分布在多个类中的行为,而不想生成太多子类的场合。

4、C++代码实现:

[cpp] view plaincopy 
  1. #include <iostream>  
  2. #include <string>  
  3. using namespace std;  

  4. class Colleague;  
  5. /*  Mediator类,抽象中介者类  */  
  6. class Mediator   
  7. {  
  8. public:  
  9.     virtual void Send(string name, Colleague * pColleague) = 0;  
  10. }; 
  11.  
  12. /* Colleague类,抽象同事类  */  
  13. class Colleague  
  14. {  
  15. protected:  
  16.     Mediator * pMediator;  
  17. public:  
  18.     Colleague(Mediator * pMediator)   
  19.     {  
  20.         this->pMediator = pMediator;  
  21.     }  
  22. };  
  23. class ConcreteColleague1 : public Colleague  
  24. {  
  25. public:  
  26.     ConcreteColleague1(Mediator * pMediator) : Colleague(pMediator) {};  
  27.       
  28.     void Send(string message)   
  29.     {  
  30.         pMediator->Send(message, this);  
  31.     }  
  32.       
  33.     void Notify(string message)   
  34.     {  
  35.         cout << "同事1得到消息:" << message << endl;  
  36.     }  
  37. };  
  38. class ConcreteColleague2 : public Colleague  
  39. {  
  40. public:  
  41.     ConcreteColleague2(Mediator * pMediator) : Colleague(pMediator) {};  
  42.       
  43.     void Send(string message)   
  44.     {  
  45.         pMediator->Send(message, this);  
  46.     }  
  47.       
  48.     void Notify(string message)   
  49.     {  
  50.         cout << "同事2得到消息:" << message << endl;  
  51.     }  
  52. };  

  53. /* ConcreteMediator类,具体中介者类  */  
  54. class ConcreteMediator : public Mediator  
  55. {  
  56. private:  
  57.     ConcreteColleague1 * pColleague1;  
  58.     ConcreteColleague2 * pColleague2;  
  59. public:  
  60.     void setColleague1(ConcreteColleague1 * pColleague1)   
  61.     {  
  62.         this->pColleague1 = pColleague1;  
  63.     }  
  64.       
  65.     void setColleague2(ConcreteColleague2 * pColleague2)  
  66.     {  
  67.         this->pColleague2 = pColleague2;  
  68.     }  
  69.       
  70.     void Send(string message, Colleague * pColleague)   
  71.     {  
  72.         if (pColleague == pColleague1)   
  73.         {  
  74.             pColleague2->Notify(message);  
  75.         }  
  76.         else   
  77.         {  
  78.             pColleague1->Notify(message);  
  79.         }  
  80.     }  
  81. }; 
  82.  
  83. int main()   
  84. {  
  85.     ConcreteMediator * pMediator = new ConcreteMediator();  
  86.     /* 让两个具体同事类认识中介者对象  */  
  87.     ConcreteColleague1 * pC1 = new ConcreteColleague1(pMediator);  
  88.     ConcreteColleague2 * pC2 = new ConcreteColleague2(pMediator);  
  89.     /* 让中介者认识各个具体同事类对象  */  
  90.     pMediator->setColleague1(pC1);  
  91.     pMediator->setColleague2(pC2);  
  92.     /* 具体同事类对象的发送信息都是通过中介者转发 */  
  93.     pC1->Send("吃过饭了没有");  
  94.     pC2->Send("还没呢,你要请客?");  
  95.     return 0;  
  96. }