Mediator パターン

Mediator パターン - Wikipedia

オブジェクト(Colleague)間の通信を仲介者(Mediator)を通して行うことによって、オブジェクト同士の結合強度を下げる・モジュール間の依存度を下げることができる。

以下の例はMediatorとしてチャットルームの管理者的なものを、Colleagueとしてチャットルームの参加者・ブロードキャスト用のクラスを例にコードを書いた。参加者同士が投げたメッセージの宛先をMediatorが分類しているイメージ。

#include <iostream>
#include <string>
#include <map>
using namespace std;

class Colleague;

//Mediator
class Mediator
{
public :
	virtual void Register(Colleague *Colleague) = 0;
	virtual void Send(string from, string to, string message) = 0;
};
//Colleague
class Colleague
{
public : 
	Colleague(string name) : name_(name){}
	virtual ~Colleague(){}
	void SetMediator(Mediator * mediator){
		this->mediator_ = mediator;
	}
	string GetName(){return name_;}
	Mediator* GetMediator(){return mediator_;}
	virtual void Send(string to, string message) = 0;
	virtual void Receive(string from, string message) = 0;
private : 
	Mediator * mediator_;
	string name_;
};
//Concret Mediator
class Chatroom : public Mediator
{
public : 
	void Register(Colleague *colleague){
		colleague->SetMediator(this);
		colleague_[colleague->GetName()] = colleague;
	}
	void Send(string from, string to, string message){
		colleague_[to]->Receive(from, message);
	}
private : 
	map<string,Colleague*> colleague_;
};
//Concrete Colleague
class Participant : public Colleague
{
public : 
	Participant(string name) : Colleague(name){}
	~Participant(){}
	void Send(string to, string message){
		this->GetMediator()->Send(this->GetName(), to, message);
	}
	void Receive(string from, string message){
		cout << from << " to " << this->GetName() <<" : " << message << endl;
	}
};
class BroadCast : public Colleague
{
public : 
	BroadCast(string name) : Colleague(name){}
	~BroadCast(){}
	void Send(string to, string message){
	}
	void Receive(string from, string message){
		cout << from << "(broad-cast): " << message << endl;
	}
};

//main
int main() {
	
	Chatroom *chatroom = new Chatroom();

	Colleague *Taro   = new Participant("Taro");
	Colleague *Jiro   = new Participant("Jiro");
	Colleague *Saburo = new Participant("Saburo");
	Colleague *admin = new BroadCast("Admin");

	chatroom->Register(Taro);
	chatroom->Register(Jiro);
	chatroom->Register(Saburo);
	chatroom->Register(admin);

	Taro->Send("Jiro", "Hi Taro!");
	Jiro->Send("Saburo", "Please lend me money");
	Saburo->Send("Jiro", "No!");
	Saburo->Send("Admin", "Hello, Everybody!");
	
	delete Taro;
	delete Jiro;
	delete Saburo;
	delete admin;
	delete chatroom;

	return 0;
}