1. 观察者模式基础与变体需求
观察者模式作为行为型设计模式的经典代表,在C++中常用于实现对象间的一对多依赖关系。当被观察对象状态变化时,所有依赖它的观察者都会自动收到通知。标准实现通常包含Subject(目标)和Observer(观察者)两个基类,通过虚函数实现通知机制。
但在实际工程中,标准观察者模式常面临几个痛点:
- 通知粒度难以控制(观察者可能被迫接收不关心的更新)
- 线程安全性问题(跨线程通知时的竞态条件)
- 性能瓶颈(大量观察者时的线性通知开销)
- 生命周期管理复杂(观察者提前析构导致的野指针问题)
这些痛点催生了多种变体实现。下面通过几个典型场景,展示如何针对特定需求改造标准观察者模式。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 基于事件分发的变体实现
2.1 事件类型标识方案
传统观察者模式中,观察者只能通过单一的update()接口接收通知。改进方案是引入事件类型标识,让观察者可以注册特定类型的事件:
cpp复制enum class EventType {
MOUSE_CLICK,
KEY_PRESS,
NETWORK_MSG
};
class EventObserver {
public:
virtual void onEvent(EventType type, const EventData& data) = 0;
virtual ~EventObserver() = default;
};
class EventSubject {
public:
void subscribe(EventType type, EventObserver* obs) {
observers_[type].push_back(obs);
}
void notify(EventType type, const EventData& data) {
for (auto* obs : observers_[type]) {
obs->onEvent(type, data);
}
}
private:
std::unordered_map<EventType, std::vector<EventObserver*>> observers_;
};
这种实现的关键优势:
- 观察者只需处理注册的事件类型
- 减少了不必要的通知调用
- 事件分类明确,便于调试
2.2 性能优化技巧
当事件类型较多时,unordered_map查找可能成为瓶颈。可以采用以下优化:
- 枚举哈希优化:为
EventType实现定制哈希函数
cpp复制struct EventTypeHash {
size_t operato
