在嵌入式系统中,模块间的高耦合和轮询机制往往带来资源浪费与响应延迟。观察者模式通过“发布-订阅”机制,能够以轻量级方式实现模块解耦与事件驱动。本文结合传感器更新、系统状态变化等典型场景,对比事件通知机制,并给出C语言代码实现,帮助开发者高效应用观察者模式。
目录
为啥要使用观察者模式
场景举例
观察者模式在嵌入式中的核心优点
观察者模式和事件通知对比
观察者模式代码实现
1 为啥要使用观察者模式
为了解决嵌入式系统中常见的 模块解耦、事件驱动、低功耗响应 等核心问题。虽然 C 语言没有类和继承,但通过函数指针和结构体,完全可以轻量级实现观察者模式
2 场景举例
- 传感器数据更新
-
温度传感器每 500ms 采样一次
-
多个模块关心这个值:LCD 显示、日志记录、云端上报、过温告警
-
若每个模块都轮询读取 → 浪费 CPU、代码耦合高
-
用观察者模式:传感器“发布”数据,各模块“订阅” → 事件驱动、按需响应
- 系统状态变化通知
-
网络连接状态(断开/重连)
-
电池电量低
-
OTA 升级完成
-
多个业务模块需做出反应(如 UI 刷新、保存上下文、关闭外设)
- 硬件中断与业务逻辑分离
-
按键中断触发 → 不能在 ISR 中做复杂处理
-
通过观察者通知应用层任务 → 安全、可扩展
3 观察者模式在嵌入式中的核心优点

4 观察者模式和事件通知对比
4.1 功能特性对比

4.2 使用场景分析
4.2.1 观察者模式适用场景
// 1. 传感器数据变化通知多个处理模块
4.2.2 事件通知适用场景
// 1. 线程间同步等待特定条件
4.3 性能特点对比
-
观察者模式优势:
-
✅ 即时通知:无需等待,直接回调执行
-
✅ 数据丰富:可传递复杂数据结构指针
-
✅ 解耦性好:观察者与被观察者松耦合
-
✅ 扩展性强:易于添加新的观察者类型
-
事件通知优势:
-
✅ 标准IPC:符合RT-Thread IPC规范
-
✅ 阻塞等待:支持超时和非阻塞模式
-
✅ 条件组合:AND/OR逻辑组合等待
-
✅ 系统集成:与其他IPC机制统一管理
4.4 选择建议
-
选择观察者模式当:
-
需要立即响应状态变化
-
要传递复杂的数据结构
-
构建松耦合的组件架构
-
实现发布-订阅模式
-
选择事件通知当:
-
需要线程间同步等待
-
要求阻塞或超时机制
-
处理多种事件源的组合条件
-
利用RT-Thread标准IPC机制
5 观察者模式代码实现
observer.c
/**
observer.h
/**
observer_demo.c
/**
测试
msh />observer_test
评论区
登录后即可参与讨论
立即登录