设计模式-中介者模式
应用场景
问题:在面向对象系统的设计和开发过程中,对象与对象之间存在着相互依赖的关系。在对象很多的情况下,这种关系会越来越复杂,回事系统的耦合性加剧,代码不易于维护。
解决:中介者模式可以解决这种窘境。它是通过引入中介者类,将所有的对象组合到中介者中,当有对象需要和其他对象交互时,先通知中介者,再由中介者转发交互信息。
类图
代码
代码关系图
中介者
class Country;
//联合国
class UnitedNations{
public:
virtual void Declare(string message , Country* colleague)=0;
};
//联合国理事会
class UnitedNationsSecurityCouncil : public UnitedNations{
public:
UnitedNationsSecurityCouncil(){
m_China = nullptr;
m_Usa = nullptr;
}
void setCountry(Country *china,Country* usa){
m_China = china;
m_Usa = usa;
}
virtual void Declare(string messages , Country* colleague){
//当对象出现两个以上,具体和谁通信由自己想实现的功能决定
if(colleague == m_China){
m_Usa->GetMessage(messages);
}
if(colleague == m_Usa){
m_China->GetMessage(messages);
}
}
private:
Country* m_China;
Country* m_Usa;
};
对象
//国家类
class Country{
public:
Country(UnitedNations *mediator){
this->mediator = mediator;
}
virtual void GetMessage(string message)=0;
protected:
UnitedNations *mediator; //中介者
};
//美国类
class USA : public Country{
public:
USA(UnitedNations *mediator):Country(mediator){
}
//声明
void Declare(string message){
mediator->Declare(message,this);
}
//获取消息
void GetMessage(string message){
cout<<"Usa get message:"<<message<<endl;
}
};
//中国类
class China : public Country{
public:
China(UnitedNations *mediator):Country(mediator){
}
//声明
void Declare(string message){
mediator->Declare(message,this);
}
//获取消息
void GetMessage(string message){
cout<<"China get message:"<<message<<endl;
}
};
主函数
int main(){
UnitedNationsSecurityCouncil *UNSC = new UnitedNationsSecurityCouncil;
USA *usa = new USA(UNSC);
China *china = new China(UNSC);
UNSC->setCountry(china,usa);
usa->Declare("I am USA...");
china->Declare("I am China...");
return 0;
}
运行结果