找回密码
 立即注册
首页 业界区 安全 观察者模式,发布/订阅模式,与回调函数 ...

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

粉押淫 6 小时前
0 摘要

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

1.png

2.png
  1. +------------------+
  2. | SensorDriver     |
  3. +------------------+
  4. | + setCallback() -----> (Function Pointer / std::function)
  5. +------------------+
复制代码
3.2 观察者模式

3.png

3.3 发布/订阅 Pub/Sub

4.png

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

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

[code]#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

相关推荐

您需要登录后才可以回帖 登录 | 立即注册