1. 模式定义
观察者模式(Observer Pattern)是一种行为型设计模式,定义了对象间的一对多依赖关系。当一个对象(被观察者/主题)状态改变时,所有依赖它的对象(观察者)都会自动收到通知并更新。该模式广泛应用于事件处理系统、GUI组件交互和实时数据监控等场景。
2. 核心思想
解耦:将主题与观察者解耦,使它们可以独立变化
动态订阅:支持观察者随时加入/退出通知列表
自动传播:状态变化时自动触发通知机制
3. 模式结构
关键角色:
-
Subject(主题接口)
- 维护观察者列表
- 提供注册/注销方法
- 定义通知方法
notify()
-
ConcreteSubject(具体主题)
- 存储具体状态数据
- 状态改变时触发通知
-
Observer(观察者接口)
- 定义更新接口
update()
- 定义更新接口
-
ConcreteObserver(具体观察者)
- 实现具体的更新逻辑
4. C++实现示例(气象监测系统)
完整代码实现
#include <iostream>
#include <vector>
#include <algorithm>
#include <memory> // 智能指针支持
// 主题接口 --------------------------------------------------
class WeatherStation; // 前向声明
class Observer {
public:
virtual ~Observer() = default;
// 更新方法(推模型:由主题推送数据)
virtual void update(float temp, float humidity) = 0;
// 更新方法(拉模型:观察者主动获取数据)
// virtual void update(const WeatherStation& subject) = 0;
};
// 抽象主题 --------------------------------------------------
class Subject {
public:
virtual ~Subject() = default;
virtual void registerObserver(std::shared_ptr<Observer> o) = 0;
virtual void removeObserver(std::shared_ptr<Observer> o) = 0;
virtual void notifyObservers() = 0;
};
// 具体主题:气象站 -------------------------------------------
class WeatherStation : public Subject