Mediator パターン
オブジェクト(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; }