设计模式 - 中介者模式

//   设计模式:中介者模式,即用一个中介来封装一系列的对象交互。中介者使各对象不需要显示地互相引用,从而使其耦合松散,而且可以独立的改变他们之间的交互。 [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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值