/* 小鱼号的代码日志
* 设计模式
* 中介者模式
* 多个类相互耦合形成网状结构
* 中介者模式将网状结构分解为星型结构进行解耦
* 减少类间依赖,降低耦合
* 中介者承担了较多的责任,中介者出了问题,
* 整个系统就会有问题
* 具体场景:
* 智能家居开启麦克风之后 自动打开电视关灯
*/
#include<iostream>
#include<list>
#include<map>
using namespace std;
class Colleague;
class Mediator
{
public:
virtual void reg(string name,Colleague* coll) = 0;
virtual void getMsg(int stateChanged,string name) = 0;
virtual void sendMsg() = 0;
};
///抽象的同事类
class Colleague
{
public:
Colleague(Mediator* mediator,string name)
{
m_mediator = mediator;
m_name = name;
///创建对象时 将自己放入到具体的中介者管理
mediator->reg(name,this);
}
virtual ~Colleague()
{
}
Mediator* getMediator()
{
return m_mediator;
}
protected:
Mediator* m_mediator;
string m_name;
};
///具体的同事类 智能电视
class SmartTV : public Colleague
{
public:
SmartTV(Mediator* mediator,string name):
Colleague(mediator,name)
{
}
void OpenTV()
{
cout << "open smart tv" << endl;
}
void CloseTV()
{
cout << "close smart tv" << endl;
}
};
///具体的同事类 智能灯
class SmartLight : public Colleague
{
public:
SmartLight(Mediator* mediator,string name):
Colleague(mediator,name)
{
}
void OpenLight()
{
cout << "open Smart Light" << endl;
}
void CloseLight()
{
cout << "close Smart Light" << endl;
}
};
///具体的同事类 智能麦克风
class SmartMic : public Colleague
{
public:
SmartMic(Mediator* mediator,string name):
Colleague(mediator,name)
{
}
void OpenMic()
{
cout << "open Smart Mic" << endl;
getMediator()->getMsg(1,m_name);
}
void CloseMic()
{
cout << "close Smart Mic" << endl;
}
};
///具体的智能家居中介
class SmartHouseMediator :public Mediator
{
protected:
virtual void reg(string name,Colleague* coll)
{
m_colleagueMap.insert(make_pair(name,coll));
}
///中介者模式的核心 中介者协调各个具体的同事对象完成 需求
virtual void getMsg(int stateChanged,string name)
{
///接收不同的同事的消息按照需求完成对其他同事的操作
//例如:麦克风开启之后 TV打开 关灯
if(name == "SmartMic")
{
if(stateChanged == 1) //mic open
{
dynamic_cast<SmartTV*>(m_colleagueMap["SmartTV"])->OpenTV();
dynamic_cast<SmartLight*>(m_colleagueMap["SmartLight"])->CloseLight();
}
}
}
virtual void sendMsg()
{
}
private:
///中介所管理的同事集合(各种智能家电)
map<string,Colleague*> m_colleagueMap;
};
///后续购置其他智能家电。。。
void testMediator()
{
cout << "mediator patterns" << endl;
Mediator* mediator = new SmartHouseMediator();
SmartTV* tv = new SmartTV(mediator,"SmartTV");
SmartMic* mic = new SmartMic(mediator,"SmartMic");
SmartLight* light = new SmartLight(mediator,"SmartLight");
mic->OpenMic();
}
【C++设计模式】 中介者模式
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
相关阅读更多精彩内容
- “接口隔离”模式 在组建构建过程中,某些接口之间直接的依赖常常会带来很多问题、甚至根本无法实现。采用添加一层间接接...
- 中介者模式:一种行为型设计模式 应用场景:一般来说,大型的软件在开发的过程中会使用模块化的开发方式。以我现在参与的...
- 1 bind和function的发散思维-控制反转 依赖注入 引用http://www.cnblogs.com/w...