GreensnoWorld
记录点滴,分享乐趣,一块凝固的时间
2015.中介者模式
设计模式  2024年12月31日
#include <iostream>
using namespace std;

#define SAFE_DELETE(p) if(p) {delete p; p=NULL;}

class Mediator;

class Colleague
{
public:
	Colleague(Mediator *pMediator): m_pMediator(pMediator){}
	virtual void Send(wchar_t *message) = 0;

protected:
	Mediator *m_pMediator;
};

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

	void Send(wchar_t *message);

	void Notify(wchar_t *message)
	{
		wcout << message << endl;
	}
};

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

	void Send(wchar_t *message);

	void Notify(wchar_t *message)
	{
		cout << "ConcreteColleague2 is handling the message." << endl;
		wcout << message << endl;
	}
};

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

class ConcreteMediator: public Mediator
{
public:
	void Sent(wchar_t *message, Colleague *pColleague)
	{
		ConcreteColleague1 *pConcreteColleague1 = dynamic_cast<ConcreteColleague1 *>(pColleague);
		if(pConcreteColleague1)
		{
			cout << "The message is from ConcreteColleague1. Now mediator forward it to ConcreteColleague2" << endl;
			if(m_pColleague2)
			{
				m_pColleague2->Notify(message);
			}
		}
		else
		{
			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;
};

void ConcreteColleague1::Send(wchar_t *message)
{
	m_pMediator->Sent(message, this);
}

void ConcreteColleague2::Send(wchar_t *message)
{
	m_pMediator->Sent(message, this);
}

int main()
{
	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);

	wchar_t message[260] = L"Where are you from?";
	pColleague1->Send(message);

	return 0;
}

 

LIJG
余本顽劣,生于紫云下,长于汝水滨。早年求学,兴趣广泛,好高骛远,学无所成,仓皇入世。兴趣所致,投身互联网,求知未证,而立已至,始悟光阴荏苒,终需务实钻研。故有此站,记录时光,积累点滴,验证所学,分享愚见。指舞方寸间,心系万千年。
留言