c++注意点(15)----中介者模式
对于上一文章中的状态机设计,其实已经是有个中介者模式,状态机为:
1. 观察者模式 / 发布-订阅模式
2. 生产者-消费者模式
3. 状态模式(State Pattern)
4.中介者模式”的雏形
接下来介绍这个中介者模式:
一、定义
中介者模式是一种行为型设计模式,用一个中心对象(中介者)来封装多个对象之间的交互逻辑,避免这些对象互相强耦合,从而让对象之间的通信通过中介者来完成。
简单说:
- 不让各个模块直接互相调用,而是都通过一个**“中央调度员”**去协调它们。
- 这个中央调度员就是中介者(Mediato)。
二、为什么要有它?
在系统里,如果多个模块之间直接互相调用,会出现:
- 依赖关系复杂,耦合度高
- 扩展或修改一个模块时,可能影响其他多个模块
- 难以维护和调试
引入中介者模式后:
- 模块之间不再直接联系,只需要知道中介者接口。
- 中介者负责收集信息、分发命令、组织通信。
- 模块新增或删除,其他模块基本不用改,改中介者即可。
三、现实例子
现实中类似的场景很多:
机场塔台调度
飞机之间不直接联系彼此,而是通过塔台(中介者)传递起降信息和指令。聊天室
用户之间不直接发消息,而是通过聊天室服务器(中介者)转发给目标用户。嵌入式设备总控
在嵌入式系统里,不同功能模块(传感器采集、通信模块、显示模块)不直接调用对方控制函数,而是通过一个总控调度对象协调,比如任务调度器、消息总线。
四、优点
- 降低耦合:各模块不直接交互,只和中介者交互。
- 集中控制逻辑:通信逻辑集中在中介者里,更清晰、更易维护。
- 可扩展性强:增加新模块时,只需要改中介者,不必改其他模块。
五、嵌入式相关示例代码
我们假设一个嵌入式系统有:
- 温度传感器模块
Sensor - 通信模块
Comm - 显示模块
Display
它们之间要协作: - 传感器采集数据 → 通信模块发送 → 显示模块更新画面
我们用中介者模式实现。
c++版本:
#include <iostream>
#include <string>// 中介者接口
class Mediator {
public:virtual void sendMessage(const std::string& msg, const std::string& from) = 0;
};// 具体模块的抽象基类
class Module {
protected:Mediator* mediator;
public:Module(Mediator* m) : mediator(m) {}
};// 温度传感器模块
class Sensor : public Module {
public:Sensor(Mediator* m) : Module(m) {}void readTemperature(float temp) {std::string msg = "TEMP:" + std::to_string(temp);mediator->sendMessage(msg, "Sensor");}
};// 通信模块
class Comm : public Module {
public:Comm(Mediator* m) : Module(m) {}void sendData(const std::string& data) {std::cout << "[Comm] Sending data: " << data << std::endl;}
};// 显示模块
class Display : public Module {
public:Display(Mediator* m) : Module(m) {}void updateScreen(const std::string& data) {std::cout << "[Display] Screen shows: " << data << std::endl;}
};// 具体中介者
class ConcreteMediator : public Mediator {
private:Sensor* sensor;Comm* comm;Display* display;
public:void setSensor(Sensor* s) { sensor = s; }void setComm(Comm* c) { comm = c; }void setDisplay(Display* d) { display = d; }void sendMessage(const std::string& msg, const std::string& from) override {if (from == "Sensor") {comm->sendData(msg); // 传感器数据给通信模块display->updateScreen(msg); // 同时更新显示}}
};int main() {ConcreteMediator mediator;Sensor sensor(&mediator);Comm comm(&mediator);Display display(&mediator);mediator.setSensor(&sensor);mediator.setComm(&comm);mediator.setDisplay(&display);// 模拟温度读取sensor.readTemperature(26.5);return 0;
}
输出结果
[Comm] Sending data: TEMP:26.500000
[Display] Screen shows: TEMP:26.500000c语言
#include <stdio.h>
#include <string.h>// 模块接口
typedef struct Mediator Mediator;typedef struct {Mediator* mediator;
} Sensor;typedef struct {Mediator* mediator;
} Comm;typedef struct {Mediator* mediator;
} Display;// 中介者结构体
struct Mediator {Sensor* sensor;Comm* comm;Display* display;void (*sendMessage)(Mediator*, const char* msg, const char* from);
};// 模块函数
void sensor_readTemperature(Sensor* s, float temp) {char msg[32];sprintf(msg, "TEMP:%.2f", temp);s->mediator->sendMessage(s->mediator, msg, "Sensor");
}void comm_sendData(Comm* c, const char* data) {printf("[Comm] Sending data: %s\n", data);
}void display_update(Display* d, const char* data) {printf("[Display] Screen shows: %s\n", data);
}// 中介者具体实现
void mediator_sendMessage(Mediator* m, const char* msg, const char* from) {if (strcmp(from, "Sensor") == 0) {comm_sendData(m->comm, msg);display_update(m->display, msg);}
}int main() {// 创建模块和中介者Mediator mediator = {0};Sensor sensor = {&mediator};Comm comm = {&mediator};Display display = {&mediator};mediator.sensor = &sensor;mediator.comm = &comm;mediator.display = &display;mediator.sendMessage = mediator_sendMessage;// 模拟温度采集sensor_readTemperature(&sensor, 26.5);return 0;
}
输出结果:
[Comm] Sending data: TEMP:26.50
[Display] Screen shows: TEMP:26.50