最近在学习设计模式,之前都是看一遍,后来就忘了。所以还是决定记录一下
主要是学习大话设计模式这本书,把里面例子用c++重新写一遍
另外http://blog.csdn.net/column/details/design.html这个博主写得也不错,也参考一下。
中介者模式(Mediator):用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
中介者模式一般应用在一组对象以定义良好但是复杂的方式进行通信的场合,以及想定制一个分布在多个类中的行为,而又不想生成太多子类的场合。
大话数据结构中的例子:如果国家之间有矛盾,两个国家直接进行外交,就会很复杂。可以通过联合国进行调停,这样每个国家只用和联合国进行交互。
UML:
class UnitedNations;
//抽象国家
class Country {
public:
protected:
UnitedNations *UN;
public:
Country(UnitedNations *mediator) :UN(mediator) {}
virtual void SetMediator(UnitedNations *UN) {}
virtual void SendMessage(string message) {}
virtual void GetMessage(string message) {}
};
//联合国,抽象中介机构
class UnitedNations {
public:
virtual void Send(string message, Country *country) {}
};
//美国
class USA :public Country
{
public:
USA(UnitedNations *mediator) :Country(mediator) {}
void SendMessage(string message)
{
UN->Send(message, this); //通过中介发送消息
}
void GetMessage(string message)
{
cout << "USAGetMessage:" << message<<endl;
}
};
//伊朗
class Iraq :public Country
{
public:
Iraq(UnitedNations *mediator) :Country(mediator) {}
void SendMessage(string message)
{
UN->Send(message, this);
}
void GetMessage(string message)
{
cout << "IraqGetMessage:" << message<<endl;
}
};
//联合国安理会,具体中介机构类
class UnitedNationsSecurityCouncil : public UnitedNations
{
private:
Country *A;
Country *B;
public:
void SetA(Country *country) { A = country; }
void SetB(Country *country) { B = country; }
void Send(string message, Country *country)
{
if (country == A)
B->GetMessage(message);
else
A->GetMessage(message);
}
};
int main()
{
UnitedNationsSecurityCouncil *UNSC = new UnitedNationsSecurityCouncil();
USA *usa = new USA(UNSC);
Iraq *iraq = new Iraq(UNSC);
UNSC->SetA(usa);
UNSC->SetB(iraq);
usa->SendMessage("不准研制核武器,否则发动战争");
iraq->SendMessage("我们没有核武器,也不怕侵略");
system("pause");
return 0;
}