中介者模式(Mediator)
一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
使用
中介者模式一般应用于一组对象以定义良好但是复杂的方式进行通信的场合,以及想定制一个分布在多个类中的行为,而又不想生成太多的子类的场合。
- 优点:
- 首先是 Mediator (中介者)的出现减少了各个 Colleague (对象)的耦合,使得可以独立地改变和复用各个 Colleague 类和 Mediator。
- 其次,由于把对象如何协作进行了抽象,将中介作为一个独立的概念并将其封装在一个对象中,这样关注的对象就从对象各自本身的行为转移到它们之间的交互上来,也就是站在一个更宏观的角度去看待系统。
- 缺点:由于 ConcreteMediator 控制了集中化,于是就把交互复杂性变为了中介者的复杂性,这就使得中介者会变得比任何一个 ConcreteColleague 都复杂。
结构图
example
联合国安理会作为中介者的角色,负责各个国家之间的信息传递。
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
class UnitedNations;
// 抽象国家
class Nations
{
protected:
UnitedNations *un;
public:
Nations(UnitedNations *u) : un(u) {}
virtual void send(Nations *to,string message) = 0;
virtual void notify(Nations *from,string messages) = 0;
};
// 抽象联合国类 其下有各种组织
class UnitedNations
{
public:
virtual void send(Nations *from,Nations *to,string message) = 0;
};
class China : public Nations
{
public:
China(UnitedNations *u) : Nations(u) {}
virtual void send(Nations *to,string message)
{
un->send(this,to,message);
}
virtual void notify(Nations *from,string messages)
{
cout << "China收到来自 " << typeid(*from).name() << " 的消息:" << messages << endl;
}
};
class Russia : public Nations
{
public:
Russia(UnitedNations *u) : Nations(u) {}
virtual void send(Nations *to,string message)
{
un->send(this,to,message);
}
virtual void notify(Nations *from,string messages)
{
cout << "Russia收到来自 " << typeid(*from).name() << " 的消息:" << messages << endl;
}
};
// 联合国安理会
class UnitedNationsSecurityCouncil : public UnitedNations
{
Nations *c1;
Nations *c2;
public:
// UnitedNationsSecurityCouncil(Nations *c1,Nations *c2):c1(c1),c2(c2){}
void setN1(Nations *c){ c1 = c;}
void setN2(Nations *c){ c2 = c;}
virtual void send(Nations *from,Nations *to,string message)
{
to->notify(from,message);
}
};
int main()
{
UnitedNations *un = new UnitedNationsSecurityCouncil();
Nations *c = new China(un);
Nations *r = new Russia(un);
c->send(r,"hello");
r->send(c,"hi");
return 0;
}