当前位置: 首页 > news >正文

c++注意点(15)----中介者模式

对于上一文章中的状态机设计,其实已经是有个中介者模式,状态机为:

1. 观察者模式 / 发布-订阅模式

2. 生产者-消费者模式

3. 状态模式(State Pattern)

4.中介者模式”的雏形

接下来介绍这个中介者模式:

一、定义

中介者模式是一种行为型设计模式,用一个中心对象(中介者)来封装多个对象之间的交互逻辑,避免这些对象互相强耦合,从而让对象之间的通信通过中介者来完成。

简单说:

  • 不让各个模块直接互相调用,而是都通过一个**“中央调度员”**去协调它们。
  • 这个中央调度员就是中介者(Mediato)。

二、为什么要有它?

在系统里,如果多个模块之间直接互相调用,会出现:

  • 依赖关系复杂,耦合度高
  • 扩展或修改一个模块时,可能影响其他多个模块
  • 难以维护和调试

引入中介者模式后:

  • 模块之间不再直接联系,只需要知道中介者接口。
  • 中介者负责收集信息、分发命令、组织通信。
  • 模块新增或删除,其他模块基本不用改,改中介者即可。

三、现实例子

现实中类似的场景很多:

  1. 机场塔台调度

    飞机之间不直接联系彼此,而是通过塔台(中介者)传递起降信息和指令。
  2. 聊天室

    用户之间不直接发消息,而是通过聊天室服务器(中介者)转发给目标用户。
  3. 嵌入式设备总控

    在嵌入式系统里,不同功能模块(传感器采集、通信模块、显示模块)不直接调用对方控制函数,而是通过一个总控调度对象协调,比如任务调度器、消息总线。

四、优点

  1. 降低耦合:各模块不直接交互,只和中介者交互。
  2. 集中控制逻辑:通信逻辑集中在中介者里,更清晰、更易维护。
  3. 可扩展性强:增加新模块时,只需要改中介者,不必改其他模块。

五、嵌入式相关示例代码

我们假设一个嵌入式系统有:

  • 温度传感器模块 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.500000

c语言

#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

http://www.dtcms.com/a/521708.html

相关文章:

  • 正规网站建设团队是什么怎么在自己的网站上传视频
  • vs2017手机网站开发一千元左右最好的手机
  • 整站优化seo公司哪家好弹幕网站开发代码
  • 大学英文网站建设方案搜索引擎营销广告
  • 中文网站什么意思广州公司注册一网通
  • 赣州找工作的网站私自做彩票网站销售犯法么
  • TDengine 数学函数 RAND 用户手册
  • windows 安装 TDengine
  • 网站制度建设存在的问题服务器重启 iis网站暂停
  • 蛋白表达原理与关键要素解析
  • 网站seo搜索引擎优化案例千牛怎么做免费推广引流
  • 为什么top和/proc/pid/statm、/proc/pid/statm 统计的内存结果不同
  • 基于SpringBoot2+Vue2的论坛发帖交流平台
  • 耒阳在那做网站抖音关键词排名系统
  • 如何用万网做自己的网站网页游戏开发软件
  • 纪念馆网站建设方案旅游网站技术方案
  • 阮一峰《TypeScript 教程》学习笔记——数组
  • KVSTORE_Pain point_tuchuang_ROS2
  • 清控人居建设集团网站wordpress 主题 设计
  • 和17做网店一样的货源网站做网站设计管理的专业
  • 趋势强度识别对ETF止盈触发条件的改进路径
  • 杭州房产网官网企业网站seo模板
  • 中国万网建站平台做移动网站建设
  • 网站内部链接的作用有哪些正规网站建设找哪家好
  • 【11408学习记录】考研数学高频考点精讲:古典概型+几何概型解题框架
  • 济南网站建设有限公司排名好的移动网站建设
  • 网站备份脚本中国最大的库存尾货清货平台
  • 好的外贸网站的特征网络直接销售的营销方式
  • 有做浏览单的网站wordpress和woo
  • 临沂网站建设便宜电商网站建设