// 设计模式:中介者模式,即用一个中介来封装一系列的对象交互。中介者使各对象不需要显示地互相引用,从而使其耦合松散,而且可以独立的改变他们之间的交互。 [8/13/2016 ZOSH];
// 应用场景:1.解决软件规模变大时,对象间复杂的通信关系;2. 将通信的复杂性单独抽离出来维护;
// 模式说明:结构图如下(其中图片摘自《大话设计模式》,提交后文档排版不太好);
// 完整代码:http://download.youkuaiyun.com/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;
}