C++中介者模式(Mediator)

UML类图(仅供参考)如下:

中介者模式解决的问题:

用来降低多个对象和类之间的通信复杂性。这种模式提供了一个中介类,该类通常处理不同类之间的通信,并支持松耦合,使代码易于维护。用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。对象与对象之间存在大量的关联关系,这样势必会导致系统的结构变得很复杂,同时若一个对象发生改变,我们也需要跟踪与之相关联的对象,同时做出相应的处理。

源码

#include <iostream>
#include <string>

// 同事类声明
class CColleague;

// 抽象中介者
class CMediator
{
public:
	CMediator() :m_pColleague1(NULL), m_pColleague2(NULL) {}

	// 中介者添加同事
	virtual void AddConlleague(CColleague *pColleague) = 0;

	// 中介者转发同事消息
	virtual void Send(const std::string &sMessage, CColleague *pColleague) = 0;

protected:
	// 假如只有两个同事(一般的,一个中介者只有两个同事)
	CColleague *m_pColleague1;
	CColleague *m_pColleague2;
};

// 抽象同事
class CColleague
{
public:
	CColleague(CMediator *pMediator) :m_pMediator(pMediator) {}

	// 同事发送信息
	virtual void Send(const std::string &sMessage) = 0;

	// 同事接收消息
	virtual void Recv(const std::string &sMessage) = 0;

protected:
	// 所有的同事都认识中介者
	CMediator *m_pMediator;
};

// 同事1
class CConcreteColleague1 :public CColleague
{
public:
	CConcreteColleague1(CMediator *pMediator) :CColleague(pMediator) {}

	// 通过中介者转发信息
	virtual void Send(const std::string &sMessage)
	{
		m_pMediator->Send(sMessage, this);
	}

	// 收到的消息是由中介者代收的
	virtual void Recv(const std::string &sMessage)
	{
		std::cout << "同事1收到的消息为:" << sMessage << std::endl;
	}
};

// 同事2
class CConcreteColleague2 :public CColleague
{
public:
	CConcreteColleague2(CMediator *pMediator) :CColleague(pMediator) {}

	// 通过中介者发送信息
	virtual void Send(const std::string &sMessage)
	{
		m_pMediator->Send(sMessage, this);
	}

	// 收到的消息是由中介者代收的
	virtual void Recv(const std::string &sMessage)
	{
		std::cout << "同事2收到的消息为:" << sMessage << std::endl;
	}
};

class CConcreteMediator :public CMediator 
{
public:

	// 中介者添加一个人事的同事
	virtual void AddConlleague(CColleague *pColleague)
	{
		if (NULL == m_pColleague1)
		{
			m_pColleague1 = pColleague;
		}
		else
		{
			m_pColleague2 = pColleague;
		}
	}

	// 中介者转发一个消息
	virtual void Send(const std::string &sMessage, CColleague *pColleague)
	{
		if (pColleague == m_pColleague1)
		{
			m_pColleague2->Recv(sMessage);
		}
		else
		{
			m_pColleague1->Recv(sMessage);
		}
	}
};

int main()
{
	CMediator *pMediator = new CConcreteMediator();
	CColleague *pColleague1 = new CConcreteColleague1(pMediator);
	CColleague *pColleague2 = new CConcreteColleague2(pMediator);

	pMediator->AddConlleague(pColleague1);
	pMediator->AddConlleague(pColleague2);

	pColleague1->Send("你好,我是1");
	pColleague2->Send("你好,我是2");

	return 0;
}

好处

1、降低了类的复杂度,将一对多转化成了一对一。

2、各个类之间的解耦。

3、符合迪米特原则

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值