Mediator模式,用一箇中介對象來封裝一系列的對象交互。中介者使各對象不須要顯式的相互引用,從而使其耦合鬆散,並且能夠獨立地改變它們之間的交互。ios
比較典型的例子是聯合國、QQ羣等。好比,若是中國有事須要通知世界各國,能夠經過聯合國這一個機構,QQ羣能夠接收併發布每一個成員的消息。設計模式
/* * file: Mediator.h * brief: Created by night at 2016.12.07 */
#ifndef __MEDIATOR_H__
#define __MEDIATOR_H__
#include <list>
#include <iostream>
using namespace std;
class Nation;
class Mediator {
public:
virtual void Send(Nation* member, const char* msg) = 0;
};
class UnitedNationsMediator : public Mediator {
public:
UnitedNationsMediator() { }
void Register(Nation* member) { members.push_back(member); }
void Send(Nation* member, const char* msg);
list<Nation*> members;
};
class Nation {
public:
Nation(const char* sname, Mediator* m) : name(sname), mediator(m) { }
void Send(const char* msg) { mediator->Send(this, msg); }
void Notify(const char* sender, const char* msg) { cout << name << "\t<-- " << sender << ":\t" << msg << endl; }
const char* name;
protected:
Mediator* mediator;
};
class China : public Nation
{
public:
China(const char* sname, Mediator* m): Nation(sname, m) { }
};
class USA : public Nation
{
public:
USA(const char* sname, Mediator* m) : Nation(sname, m) { }
};
class England : public Nation
{
public:
England(const char* sname, Mediator* m) : Nation(sname, m) { }
};
void TestMediator();
#endif
/* * file: Mediator.cpp * brief: Created by night at 2016.12.07 */
#include "Mediator.h"
void UnitedNationsMediator::Send(Nation* member, const char* msg) {
for (list<Nation*>::iterator itr = members.begin(); itr != members.end(); itr++) {
(*itr)->Notify(member->name, msg);
}
}
void TestMediator()
{
UnitedNationsMediator* mediator = new UnitedNationsMediator();
China* china = new China("China", mediator);
mediator->Register(china);
USA* usa = new USA("USA", mediator);
mediator->Register(usa);
England* england = new England("England", mediator);
mediator->Register(england);
china->Send("This is from China!");
cout << endl;
usa->Send("This is from USA!");
cout << endl;
// destroy ...
delete mediator;
mediator = NULL;
delete china;
china = NULL;
delete usa;
usa = NULL;
delete england;
england = NULL;
}
輸出結果:markdown
China <-- China: This is from China!
USA <-- China: This is from China!
England <-- China: This is from China!
China <-- USA: This is from USA!
USA <-- USA: This is from USA!
England <-- USA: This is from USA!