这是大话设计模式是中的中介者模式的c++版本
/*
* mediator.cpp
*
* Created on: Oct 20, 2017
* Author: clh@163.com
* 中介者模式:用一个中介对象来封装一系列的对象交互。
* 中介者使各个对象不需要显式的相互引用,
* 从而使其结构松散,而且可以独立的改变它
* 们之间的交互。
*/
#include <iostream>
#include <string>
using namespace std;
//前置声明
class UnitedNations;
//国家类 相当于需要使用中介者沟通的对象
class Country
{
public:
Country(UnitedNations* mediator):mediator_(mediator){}
protected:
UnitedNations* mediator_;
};
//联合国类 相当于抽象中介者类
class UnitedNations
{
public:
virtual ~UnitedNations(){}
virtual void Declare(string name,Country* colleague)=0;
};
//国家类 相当于colleague类
class Usa:public Country
{
public:
Usa(UnitedNations* mediator):Country(mediator){}
void Declare(string message)
{
mediator_->Declare(message,this);
}
//获取消息
void GetMessage(string message)
{
cout<<"美国获取对方的信息:"<<message<<endl;
}
};
class Iraq:public Country
{
public:
Iraq(UnitedNations* mediator):Country(mediator){}
void Declare(string message)
{
mediator_->Declare(message,this);
}
//获取消息
void GetMessage(string message)
{
cout<<"伊拉克获取对方的信息:"<<message<<endl;
}
};
//安理会 相当于中介者实例
class UnitedNationsSecurityCouncil:public UnitedNations
{
public:
//中介者了解所有对象所有拥有所有对象的属性
void SetUsa(Usa* usa){_usa = usa;}
Usa* GetUsa(){return _usa;}
void SetIraq(Iraq* iraq){_iraq = iraq;}
Iraq* GetIraq(){return _iraq;}
//重写Declare实现通信
void Declare(string message,Country* country) override
{
if(country == _usa)
{
_iraq->GetMessage(message);
}else
{
_usa->GetMessage(message);
}
}
private:
Usa* _usa;
Iraq* _iraq;
};
int main()
{
UnitedNationsSecurityCouncil* UNSC = new UnitedNationsSecurityCouncil();
Usa *usa = new Usa(UNSC);
Iraq *iraq = new Iraq(UNSC);
UNSC->SetIraq(iraq);
UNSC->SetUsa(usa);
usa->Declare("不准研究核武器,不然就发动战争!");
iraq->Declare("我们没有核武器,也不怕战争!");
return 0;
}
程序输出:
clh@clh:~/testcode/设计模式$ g++ mediator.cpp -std=c++11
clh@clh:~/testcode/设计模式$ ./a.out
伊拉克获取对方的信息:不准研究核武器,不然就发动战争!
美国获取对方的信息:我们没有核武器,也不怕战争!
以下内容摘抄自设计模式:
中介者模式适用于以下情况:
1.一组对象以定义良好但是复杂的方式进行通信。产生的相互依赖关系结构混乱且难以理解。
2.一个对象引用其他很多对象并且直接与这些对象通信,导致难以复用该对象。
3.想定制一个分布在多个类中的行为,而又不想生成太多子类。
中介者模式的优点:
1.减少了子类的生成 mediator将原本分布与多个对象间的行为集中在一起。改变这些行为只需生成mediator的子类即可。这样各个colleague类可被重用。
2.它将各个colleague类解藕 你可以独立的改变和复用各colleague类和mediator类。
3.它简化了对象协议 用mediator和各colleague的一对多交互来代替多对多交互。
4.它对对象如何协作进行了抽象 将中介作为一个独立的概念并将其封装在一个对象中,使你将注意力从对象各自本身的行为转移到它们之间的交互上来。有助于弄清楚一个系统中的对象是如何交互的。
中介者模式的缺点:
1.它使控制集中化 中介者模式将交互的复杂性变为中介者的复杂性。因为中介者封装了协议,它可能变的比任何colleague都复杂。
转载请注明原地址:http://blog.csdn.net/clh01s