设计模式-21-中介者模式

本文介绍了迪米特法则的应用,通过中介者模式来实现对象间的通信,使得各个同事类不再直接相互交互,而是通过中介者进行消息传递,降低了系统组件间的耦合。示例代码展示了具体实现过程,包括Colleague和Mediator接口,以及ConcreteColleague1和ConcreteColleague2的实现,以及ConcreteMediator如何协调同事类的交互。
摘要由CSDN通过智能技术生成

迪米特法则:如果两个类不必彼此直接通信,那么这两个类就不应当发生直接的相互作用。如果其中一个类需要调用另外一个类的某一个方法的话,可以通过第三者转发这个调用。

用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。

在这里插入图片描述
Mediator:中介者,它定义了一个接口用于与各个Colleague对象通信;
ConcreteMediator:具体的中介者,它通过协调各Colleague对象实现协作行为;并了解和维护它的各个Colleague;
Colleague:同事类,每一个同事类都知道它的中介者对象;每一个同时对象在需要与其他的同事通信的时候,而是与它的中介者通信。

下面是个例子:
中介者模式.h:

class Mediator;

class Colleague
{
public:
	Colleague(Mediator *pMediator) : m_pMediator(pMediator)
	{
	}

	virtual void Send(char *message) = 0;
	virtual void Notify(char *message) = 0;

protected:
	Mediator *m_pMediator;
};

class Mediator
{
public:
	virtual void SendMessage1(char *message, Colleague *pColleague) = 0;
};

中介者模式.cpp:

#include "中介者模式.h"

class ConcreteColleague1 : public Colleague
{
public:
	ConcreteColleague1(Mediator *pMediator) : Colleague(pMediator){}

	void Send(char *message) override
	{
		m_pMediator->SendMessage1(message, this);
	}

	void Notify(char *message) override
	{
		cout << "同事1收到消息:" << endl;
		cout << message << endl;
	}
};


class ConcreteColleague2 : public Colleague
{
public:
	ConcreteColleague2(Mediator *pMediator) : Colleague(pMediator){}

	void Send(char *message) override
	{
		m_pMediator->SendMessage1(message, this);
	}
	void Notify(char *message) override
	{
		cout << "同事2收到消息:" << endl;
		wcout << message << endl;
	}
};



class ConcreteMediator : public Mediator
{
public:
	// The mediator forward the message
	void SendMessage1(char *message, Colleague *pColleague) override
	{
		ConcreteColleague1 *pConcreteColleague1 = dynamic_cast<ConcreteColleague1 *>(pColleague);
		if (pConcreteColleague1)
		{
			cout << "中介者将同事1的消息转发给同事2" << endl;
			if (m_pColleague2)
			{
				m_pColleague2->Notify(message);
			}
		}
		else
		{
			cout << "中介者将同事1的消息转发给同事2" << endl;
			if (m_pColleague1)
			{
				m_pColleague1->Notify(message);
			}
		}
	}

	void SetColleague1(Colleague *pColleague)
	{
		m_pColleague1 = dynamic_cast<ConcreteColleague1 *>(pColleague);
	}

	void SetColleague2(Colleague *pColleague)
	{
		m_pColleague2 = dynamic_cast<ConcreteColleague2 *>(pColleague);
	}

private:
	ConcreteColleague1 *m_pColleague1;
	ConcreteColleague2 *m_pColleague2;
};


int main()
{
	// Create the mediator
	Mediator *pMediator = new ConcreteMediator();

	Colleague *pColleague1 = new ConcreteColleague1(pMediator);
	Colleague *pColleague2 = new ConcreteColleague2(pMediator);

	ConcreteMediator *pConcreteMediator = dynamic_cast<ConcreteMediator *>(pMediator);
	pConcreteMediator->SetColleague1(pColleague1);
	pConcreteMediator->SetColleague2(pColleague2);

	char message[260] = "吃了吗?";
	pColleague1->Send(message);

	system("pause");
	return 0;
}

结果:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

发如雪-ty

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值