1. 观察者模式基础与变体需求
观察者模式作为行为型设计模式的经典代表,在C++中常用于实现对象间的一对多依赖关系。当被观察对象状态变化时,所有依赖它的观察者都会自动收到通知。标准实现通常包含Subject(目标)和Observer(观察者)两个核心接口:
cpp复制class Observer {
public:
virtual ~Observer() = default;
virtual void update(const std::string& message) = 0;
};
class Subject {
public:
virtual void attach(Observer* observer) = 0;
virtual void detach(Observer* observer) = 0;
virtual void notify() = 0;
};
但在实际工程中,标准模式往往面临几个典型挑战:
- 同步通知导致的性能瓶颈
- 观察者处理异常时的传播问题
- 多线程环境下的竞态条件
- 动态观察者优先级管理的缺失
这些痛点催生了多种针对不同场景的变体实现。下面我们重点分析三种具有代表性的改进方案。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 异步观察者模式实现
2.1 消息队列集成方案
传统观察者模式的同步通知机制会阻塞主题对象,当观察者处理耗时较长时,整个系统响应速度会显著下降。通过引入消息队列,我们可以将通知过程异步化:
cpp复制class AsyncSubject : public Subject {
private:
std::queue<std::function<void()>> taskQueue;
std::mutex queueMutex;
std::condition_variable cv;
std::thread workerThread;
bool running = true;
void worker() {
while (running) {
std::function<void()> task;
{
std::unique_lock<std::mutex> lock(queueMutex);
cv.wait(lock, [this]{ return !taskQueue.empty() || !running; });
if (!running && taskQueue.empty()) return;
task = std::move(taskQueue.front());
taskQueue.pop();
}
task();
}
}
public:
AsyncSubject() : workerThread(&Asy
