// 设计模式:中介者模式,即用一个中介来封装一系列的对象交互。中介者使各对象不需要显示地互相引用,从而使其耦合松散,而且可以独立的改变他们之间的交互。 [8/13/2016 ZOSH];
// 应用场景:1.解决软件规模变大时,对象间复杂的通信关系;2. 将通信的复杂性单独抽离出来维护;
// 模式说明:结构图如下(其中图片摘自《大话设计模式》,提交后文档排版不太好);
// 完整代码:http://download.csdn.net/detail/z444_579/9603020
// 简要代码:
// Colleague类 class Mediator; // // 说明:抽象同事类 [8/13/2016 ZOSH]; class Colleague { public: Colleague(void); virtual~Colleague(void); public: // 说明:重载构造方法, 得到中介者对象 [8/13/2016 ZOSH]; Colleague(Mediator* pMediator) { m_pMediator = pMediator; } protected: // 指向中介者; Mediator* m_pMediator; };
//.cpp文件;
Colleague::Colleague(void) { m_pMediator = NULL; } Colleague::~Colleague(void) { }
// Colleague1 类
#include "Colleague.h"
// 提前声明,但不包含头文件(头文件应多在cpp文件添加); class Mediator; // 具体同事类; class Colleague1 : public Colleague { public: Colleague1(void) {}; virtual~Colleague1(void) {}; public: Colleague1(Mediator* pMediator) : Colleague(pMediator) { } // 说明:发送信息,内部调用中介者发送信息 [8/13/2016 ZOSH]; void Send(string strMessage); // 说明:本类感知信息 [8/13/2016 ZOSH]; void Notify(string strMessage); };
// .cpp
#include "Mediator.h" void Colleague1::Send(string strMessage) { m_pMediator->Send(strMessage,this); } void Colleague1::Notify(string strMessage) { cout<<"同事一获得了消息"<<strMessage<<endl; }
// 添加Colleague2,与Colleague1类似
class Colleague; // 说明:抽象中介类 [8/13/2016 ZOSH]; class Mediator { public: Mediator(void) {}; virtual ~Mediator(void) {}; virtual void Send(string message, Colleague* pColleague) = 0; };
class Colleague; class Colleague1; class Colleague2; #include "Mediator.h" // 具体中介者类; class ConcreteMediator : public Mediator { public: ConcreteMediator(void); ~ConcreteMediator(void); public: // 需要了解所有的同事具体对象 Colleague1 * m_pColleague1; Colleague2 * m_pColleague2; // 重载Send 函数,根据对象作出选择判断,通知对象; void Send(string message, Colleague* pColleague); };
// 客户端代码;
#include "stdafx.h" #include "ConcreteMediator.h" #include "Colleague1.h" #include "Colleague2.h" // 中介者模式:用一个中介来封装一系列的对象交互。中介者使各对象不需要显示地互相引用,从而使其耦合松散,而且可以独立的改变他们之间的交互。 [8/13/2016 ZOSH]; // 说明:[8/13/2016 ZOSH]; int _tmain(int argc, _TCHAR* argv[]) { // 具体中介者; ConcreteMediator *pConcreteMediator = new ConcreteMediator(); // 让同事认识中介; Colleague1* pColleague1 = new Colleague1(pConcreteMediator); Colleague2* pColleague2 = new Colleague2(pConcreteMediator); //让中介认识具体的同事类; pConcreteMediator->m_pColleague1 = pColleague1; pConcreteMediator->m_pColleague2 = pColleague2; pColleague1->Send("吃饭了吗?"); pColleague2->Send("还没吃,你请吗?"); // 说明:清除相关指针和内存 [8/13/2016 ZOSH]; if (pConcreteMediator) { delete pConcreteMediator; pConcreteMediator = NULL; } if (pColleague1) { delete pColleague1; pColleague1 = NULL; } if (pColleague2) { delete pColleague2; pColleague2 = NULL; } return 0; }