粉押淫 发表于 3 天前

观察者模式,发布/订阅模式,与回调函数

0 摘要

回调函数适合简单、一对一的快速响应,比如摄像头采集完直接触发日志记录;
观察者模式适用于本地多模块联动,比如激光雷达数据同时供感知、定位和日志模块使用,互不干扰还易扩展;
发布/订阅模式通过中间件解耦,实现异步、跨系统通信,是大型无人车平台,如Apollo CyberRT的核心,适合OTA升级、数据统计等大规模、多目标场景。
这些模式本质上是不同程度的解耦策略,三者各有侧重,小用回调、中用观察者、大用Pub/Sub。
0.1 演进关系

回调函数
   ↓ 扩展为多订阅者
观察者模式
   ↓ 引入中间件解耦
发布/订阅模式0.2 选型建议


[*]简单的UI交互 → 回调函数
[*]模块间的状态监听 → 观察者模式
[*]系统间解耦通信 → 发布/订阅模式
这些模式本质上是不同程度的解耦策略,按需选择即可。
1 概念与特点

特性观察者模式(Observer)发布/订阅模式(Pub/Sub)回调函数(Callback)定义被观察对象维护多个观察者(监听者)列表,状态变化时主动通知所有已注册的observer发布者发送消息到消息代理/事件总线,中间件转发给所有该主题的订阅者,解耦了发布者和订阅者回调是一种编程技术,将一个可执行对象(如函数指针,或lambda表达式)作为参数传递,在特定事件发生时被调用耦合度中(观察者知道主题)低(通过中间件解耦):发布者和订阅者互相不知道对方存在高(直接依赖)通信方式同步调用:需要实现统一的update方法异步:通常通过消息队列或事件总线同步或异步关系一对多多对多一对一(通常)复杂性中等高(需要消息系统)低使用场景GUI事件、数据监听微服务、分布式系统;可以按主题过滤消息;可以跨进程,甚至分布式部署,是现代无人车平台基础架构之一,如Apollo CyberRT,等简单异步通知、事件处理伸缩性有限(所有观察者一起通知)好(可动态增减订阅者)差(硬编码关系)优点支持多目标联动、便于功能拓展扩展性好,低耦合、支持分布式部署实现简单、效率高缺点notify过程可能阻塞主线程引入中间件复杂度高、调试难度增加扩展性差、耦合度高2 典型场景

场景推荐模式描述日志记录三种均可每当关键数据流或异常发生时,通过回调/observer/subscriber写入日志异常报警Callback,或Pub/Sub硬件故障实时推送报警信息;安全策略统一响应数据统计分析Pub/Sub后台统计模块汇聚各路指标,为运维团队提供健康报告OTA升级广播Pub/Sub新固件上线后批量通知车辆终端依次下载更新UI界面刷新Observer路径规划结果产生,即时渲染路线信息单设备采集处理Callback摄像头采集完成,快照并同步输出日志3 UML类图

3.1 回调函数



+------------------+
| SensorDriver   |
+------------------+
| + setCallback() -----> (Function Pointer / std::function)
+------------------+3.2 观察者模式


3.3 发布/订阅 Pub/Sub


EventBUS/Broker为消息总线,可以是Channel/EventBus/MQ,等。
4 C++ Demo

4.1 回调函数 Demo —— 日志记录&异常监控

#include #include class CameraDriver {public:    void setFrameCallback(std::function cb) {      callback_ = cb;    }    void captureFrame(int frameId) {      // 通知外部业务,比如写日志      if (callback_) {      callback_(frameId);      }    }private:    std::function callback_;};void logFrameEvent(int id) {    std::cout
页: [1]
查看完整版本: 观察者模式,发布/订阅模式,与回调函数