1. Observer模式核心概念解析
Observer模式(观察者模式)是行为型设计模式中最常用的模式之一,它定义了对象之间一对多的依赖关系。当被观察对象状态发生改变时,所有依赖于它的观察者对象都会自动收到通知并更新。这种模式在事件处理系统、消息队列、GUI组件交互等场景中应用广泛。
我在实际项目中最经典的应用案例是股票行情系统:当某支股票价格变动时,所有关注该股票的投资者(无论是手机APP、网站还是后台系统)都需要实时收到价格更新。如果不使用Observer模式,我们就需要编写大量硬编码的调用逻辑,而Observer模式让这种动态订阅机制变得优雅且可维护。
2. Observer模式结构详解
2.1 经典UML类图实现
标准的Observer模式包含以下核心角色:
cpp复制// 抽象主题(Subject)
class Subject {
public:
virtual void Attach(Observer* observer) = 0;
virtual void Detach(Observer* observer) = 0;
virtual void Notify() = 0;
};
// 具体主题(ConcreteSubject)
class ConcreteSubject : public Subject {
private:
std::list<Observer*> observers_;
int state_;
public:
void Attach(Observer* observer) override {
observers_.push_back(observer);
}
void Detach(Observer* observer) override {
observers_.remove(observer);
}
void Notify() override {
for (auto observer : observers_) {
observer->Update(state_);
}
}
void SetState(int state) {
state_ = state;
Notify(); // 状态变更时自动通知观察者
}
};
// 抽象观察者(Observer)
class Observer {
public:
virtual void Update(int state) = 0;
};
// 具体观察者(ConcreteObserver)
class ConcreteObserver : public Observer {
private:
int observer_state_;
public:
void Update(int state) override {
observer_state_ = state;
std::cout << "Observer state updated to: " << observer_state_ << std::endl;
}
};
2.2 现代C++实现变体
在C++11及以后版本中,我们可以利用智能指针和lambda表达式实现更安全的Observer模式:
cpp复制#include <memory>
#include <vector>
#include <functional>
class ModernSubject {
private:
std::vector<std::function<void(int)>> callbacks_;
public:
void Register(std::function<void(int)> callback) {
callbacks_.push_back(callback);
}
void NotifyAll(int
