观察者模式通过定义一对多依赖实现对象间松耦合通信,当被观察者状态改变时自动通知所有观察者。使用C++抽象基类定义Observer接口,Subject维护weak_ptr观察者列表并提供attach、detach和notify方法,ConcreteObserver通过shared_from_this注册到Subject,并在update中响应状态变化。示例中两个观察者成功接收状态更新,智能指针管理生命周期避免内存泄漏,适用于事件系统与MVC架构。

观察者模式是一种行为设计模式,用于在对象之间定义一对多的依赖关系,当一个对象的状态发生改变时,所有依赖它的对象都会自动收到通知。在C++中,可以通过抽象基类、指针或智能指针来实现这种松耦合的通信机制。
1. 定义观察者接口(Observer)
观察者需要实现一个统一的更新接口,以便被通知状态变化。
class Observer {
public:
virtual ~Observer() =
default;
virtual void update() = 0;
};
2. 定义被观察者(Subject)
被观察者维护一个观察者列表,提供添加、删除和通知观察者的方法。
include include gorithm>
include class Subject {
private:
std::vector<:weak_ptr>> observers;
int state;
public:
void attach(std::shared_ptr observer) {
observers.push_back(observer);
}
void detach(std::shared_ptr observer) {
observers.erase(
std::remove_if(observers.begin(), observers.end(),
[&](const std::weak_ptr& obs) {
auto locked = obs.lock();
return !locked || locked == observer;
}),
observers.end()
);
}
void notify() {
for (auto& obs : observers) {
if (auto observer = obs.lock()) {
observer->update();
}
}
}
void setState(int s) {
state = s;
notify();
}
int getState() const { return state; }
};
3. 实现具体观察者(ConcreteObserver)
具体观察者实现update方法,根据被观察者的状态做出响应。
立即学习“C++免费学习笔记(深入)”;
class ConcreteObserver : public Observer {
private:
std::string name;
std::shared_ptr subject;
public:
ConcreteObserver(std::string n, std::shared_ptr sub)
: name(n), subject(sub) {
subject->attach(shared_from_this());
}
void update() override {
if (subject) {
std::cout getState() 4. 使用示例
将各个部分组合起来测试观察者模式。
int main() {
auto subject = std::make_shared();
auto obs1 = std::make_shared("观察者A", subject);
auto obs2 = std::make_shared("观察者B", subject);
subject->setState(10); // 两个观察者都会收到通知
subject->setState(20);
return 0;
}
基本上就这些。使用智能指针可以有效避免内存泄漏和悬空指针问题,尤其是用std::shared_ptr配合std::weak_ptr管理观察者生命周期,是现代C++中推荐的做法。这个模式特别适合用在事件处理系统、GUI组件更新或数据模型与视图同步等场景。