设计模式之中介者模式
中介者模式,用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显示地互相引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。该模式很好理解,其UML图如下:
Mediator中每个交互者的引用,在Mediator内部封装了各种类之间的交互。至于那个类和那个类交合则有具体的需求来决定。示例代码如下:
1 // MediatorModel.h文件 2 #pragma once 3 #include <string> 4 #include <iostream> 5 6 class Colleague; 7 8 class Mediator 9 { 10 public: 11 virtual void send(std::string msg, Colleague * p) = 0; 12 }; 13 14 class Colleague 15 { 16 protected: 17 Mediator * m_mediator; 18 public: 19 Colleague(Mediator * p) 20 { 21 m_mediator = p; 22 } 23 virtual void send(std::string msg) = 0; 24 virtual void notify(std::string msg) = 0; 25 }; 26 27 class ConcreteColleague_0 : public Colleague 28 { 29 public: 30 ConcreteColleague_0(Mediator * p) : Colleague(p) {} 31 void send(std::string msg) 32 { 33 m_mediator->send(msg, this); 34 } 35 void notify(std::string msg) 36 { 37 std::cout << "Colleague_0 收到了消息:" << msg << std::endl; 38 } 39 }; 40 41 class ConcreteColleague_1 : public Colleague 42 { 43 public: 44 ConcreteColleague_1(Mediator * p) : Colleague(p) {} 45 void send(std::string msg) 46 { 47 m_mediator->send(msg, this); 48 } 49 void notify(std::string msg) 50 { 51 std::cout << "Colleague_1 收到了消息:" << msg << std::endl; 52 } 53 }; 54 55 class ConcreteMediator : public Mediator 56 { 57 private: 58 // 这里也可以是一个列表 59 Colleague * m_p1; 60 Colleague * m_p2; 61 public: 62 void addColleague(Colleague * p1, Colleague * p2) 63 { 64 m_p1 = p1; 65 m_p2 = p2; 66 } 67 void send(std::string msg, Colleague * p) 68 { 69 // 这里接受来自一个同事发过来的消息,具体应该给谁要根据需求来 70 // 这里知识一个很简单的应用。比如该类总可以是有两个队列。 71 // 一个队列是客户,一个队列是客服 72 if (p == m_p1) 73 m_p2->notify(msg); 74 else 75 m_p1->notify(msg); 76 } 77 };
测试代码如下:
1 #include <iostream> 2 #include "MediatorModel.h" 3 4 int main() 5 { 6 using namespace std; 7 // 中介者模式 8 ConcreteMediator * p = new ConcreteMediator(); 9 Colleague * pCol1 = new ConcreteColleague_0(p); 10 Colleague * pCol2 = new ConcreteColleague_1(p); 11 p->addColleague(pCol1, pCol2); 12 pCol1->send("你下班了吗?"); 13 pCol2->send("没呢,你呢?"); 14 delete pCol1; 15 delete pCol2; 16 delete p; 17 18 getchar(); 19 return 0; 20 }
测试结果如下图:
Mediator的出现减少了各个Colleague的耦合,使得可以读来地改变和复用各个Colleague类和Mediator。由于把对象如何协作进行了抽象,将中介作为一个独立的概念并将其封装在一个对象中,这样关注的对象就从对象各自本身的行为转移到它们之间的交互上来,也就是站在一个更宏观的角度去看待系统。等于说使把交互的复杂性变为了中介的复杂性。