Observer 模式概述
Observer 模式是行为型设计模式的核心之一,核心逻辑是一对多依赖:当被观察者(Subject)的状态变化时,所有注册的观察者(Observer)会被自动通知并执行更新操作。
用生活场景类比:
- 被观察者(Subject):电商平台的商品库存
- 观察者(Observer):库存预警系统、用户订阅提醒、商家后台
- 逻辑:商品库存低于阈值(状态变化),所有关联的观察者都会收到通知并执行对应操作。
核心角色
C++ 中通过抽象类(纯虚函数) 定义接口,具体类实现接口,核心角色分为 4 个:
- Observer(抽象观察者):纯虚类,定义
update更新接口。 - ConcreteObserver(具体观察者):实现
update,处理具体的更新逻辑。 - Subject(抽象被观察者):纯虚类,定义
attach(添加观察者)、detach(移除观察者)、notify(通知观察者)接口。 - ConcreteSubject(具体被观察者):实现 Subject 接口,维护观察者列表和自身状态,状态变化时触发
notify。
C++ 代码实现
以「商品库存监控」为例,代码包含完整的类设计、内存管理(C++ 核心)和测试逻辑:
#include <iostream>
#include <vector>
#include <algorithm> // 用于 find/erase
// ---------------------- 抽象层 ----------------------
// 前向声明:解决循环依赖问题(Observer 需要知道 Subject,反之亦然)
class Subject;
// 抽象观察者
class Observer {
public:
// 纯虚更新接口:接收被观察者的状态(库存)
virtual void update(int stock) = 0;
// 虚析构:确保子类析构被正确调用(C++ 内存管理关键)
virtual ~Observer() = ;
};
{
:
= ;
= ;
= ;
~() = ;
};
: Subject {
:
std::vector<Observer*> observers_;
stock_;
:
( init_stock) : (init_stock) {}
{
(std::(observers_.(), observers_.(), observer) == observers_.()) {
observers_.(observer);
std::cout << << (*observer).() << std::endl;
}
}
{
it = std::(observers_.(), observers_.(), observer);
(it != observers_.()) {
observers_.(it);
std::cout << << (*observer).() << std::endl;
}
}
{
std::cout << << std::endl;
( observer : observers_) {
observer->(stock_);
}
}
{
(new_stock != stock_) {
stock_ = new_stock;
();
}
}
{ stock_; }
};
: Observer {
:
alarm_threshold_;
:
( threshold) : (threshold) {}
{
std::cout << << stock << ;
(stock < alarm_threshold_) {
std::cout << << alarm_threshold_ << ;
}
std::cout << std::endl;
}
};
: Observer {
:
{
std::cout << << stock << << std::endl;
}
};
{
;
;
MerchantBackend backend;
product.(&alarm);
product.(&backend);
std::cout << << std::endl;
product.();
std::cout << << std::endl;
product.();
std::cout << << std::endl;
product.(&backend);
product.();
;
}


