初学设计模式之中介者(Mediator)模式
1、定义与概念
原始的定义是用一个中介对象来封装一系列的对象交互。中介者使得各对象不需要显示的交互引用,从而使其耦合解散,而且独立的改变他们之间的交互。用通俗一点的话来描述就是,本来是对象1和对象2之间的调用,现在都改成对象1调用终结者对象,再由由中介者调用对象2,反之亦然。
2、中介者模式的优点、缺点
优点:
因为中介者使在对象与对象之间起到中转站的作用,因此降低了对象与对象之间的耦合性
如果原来对象们之间的交互方式错综复杂,呈现出网状结构,可以通过中介者把网状结构变成星形结构,使得结构变得更加清晰
缺点
中介者自身的逻辑过于复杂,和不同同事之间依赖的关系太多,如果对象们本身的交互方式不是很复杂,就不需要中介者模式
3、程序例子
考虑一个场景:大家在工作大厅上班,因为比较安静,同事与同事之间不能直接沟通,就需要在线聊天工具作为中介者,同事A向在线工具传递信息,在线工具再向另外一个同事传递信息
1 #include"iostream" 2 using namespace std; 3 class AbstractColleage; 4 class AbstractMediator 5 { 6 public: 7 virtual void declare(AbstractColleage *m_AbstractColleage) 8 { 9 }; 10 }; 11 class AbstractColleage 12 { 13 public: 14 AbstractMediator* m_AbstractMediatorPtr; 15 public: 16 void set(AbstractMediator *AbstractMediator) 17 { 18 m_AbstractMediatorPtr=AbstractMediator; 19 } 20 }; 21 22 //同事A 23 class ColleageA:public AbstractColleage 24 { 25 public: 26 void declare() 27 { 28 cout<<"同事A发消息"<<endl; 29 m_AbstractMediatorPtr->declare(this); 30 }; 31 void receive() 32 { 33 cout<<"同事A收到消息"<<endl; 34 }; 35 }; 36 37 //同事B 38 class ColleageB:public AbstractColleage 39 { 40 public: 41 void declare() 42 { 43 cout<<"同事B发消息"<<endl; 44 m_AbstractMediatorPtr->declare(this); 45 } 46 void receive() 47 { 48 cout<<"同事B收到消息"<<endl; 49 } 50 }; 51 52 //具体中介者 53 class ConcreteMediator:public AbstractMediator 54 { 55 public: 56 ColleageA m_colleageA; 57 ColleageB m_colleageB; 58 59 public: 60 void declare(AbstractColleage *m_AbstractColleage) 61 { 62 if (m_AbstractColleage==&m_colleageA) 63 { 64 m_colleageB.receive(); 65 } 66 else 67 { 68 m_colleageA.receive(); 69 } 70 } 71 72 }; 73 74 int main() 75 { 76 ConcreteMediator m_ConcreteMediator; 77 ColleageA m_ColleageA; 78 ColleageB m_ColleageB; 79 m_ConcreteMediator.m_colleageA=m_ColleageA; 80 m_ConcreteMediator.m_colleageB=m_ColleageB; 81 m_ColleageA.m_AbstractMediatorPtr=&m_ConcreteMediator; 82 m_ColleageB.m_AbstractMediatorPtr=&m_ConcreteMediator; 83 84 m_ColleageA.declare(); 85 86 getchar(); 87 return 0; 88 }
4类图总结
5、核心记忆(菜鸟驿站:集中取快递和邮快递的地方)
中介者模式就是为多个交互对象设立了中转站,让错综复杂的网状结构变成了星状结构