模式特点
定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。又称发布-订阅模式。
- 主题和观察者之间松耦合
- 支持广播式通知,一个主题可对应多个观察者
- 运行时动态增删观察者
- 是 Qt 信号槽机制的底层思想
类图
应用场景
- Qt 信号槽:QObject 的 signals/slots 就是观察者模式的实现
- 机器人状态监控:运动状态变化通知 UI、日志、安全模块
- 事件处理系统:按键事件通知多个监听器
- MVC 架构:Model 变化通知多个 View 更新
- 实时数据推送:传感器数据更新通知订阅者
示例代码(C++)
// 观察者接口 class Observer { public: virtual void update(const std::string& event, const std::string& data) = 0; virtual ~Observer() = default; }; // 主题 - 机器人状态 class RobotState { std::vector<Observer*> m_observers; public: void subscribe(Observer* o) { m_observers.push_back(o); } void notify(const std::string& event, const std::string& data) { for (auto* o : m_observers) o->update(event, data); } void setStatus(const std::string& status) { notify("状态变更", status); } }; // 具体观察者 - UI显示 class UIDisplay : public Observer { public: void update(const std::string& e, const std::string& d) override { std::cout << "[UI] " << e << ": " << d << std::endl; }}; // 具体观察者 - 日志记录 class Logger : public Observer { public: void update(const std::string& e, const std::string& d) override { std::cout << "[LOG] " << e << ": " << d << std::endl; }}; RobotState state; state.subscribe(new UIDisplay()); state.subscribe(new Logger()); state.setStatus("运动中"); // 同时通知 UI 和日志