观察者模式通过Subject与Observer接口实现一对多依赖更新。1. Subject维护观察者列表,状态变化时通知所有Observer;2. Observer定义update纯虚函数接收通知;3. 使用智能指针与弱引用避免内存泄漏和悬挂指针;4. 加入互斥锁保障多线程安全;5. 适用于事件系统、日志广播等解耦场景。

观察者模式是一种行为设计模式,用于在对象之间建立一对多的依赖关系,当一个对象状态改变时,所有依赖它的对象都会收到通知并自动更新。在C++中,这种机制常被用来实现事件通知系统,达到模块间的解耦。
观察者模式包含两个主要角色:
通过抽象接口,Subject不需要知道具体是谁在监听,实现了发送方与接收方的解耦。
下面是一个简洁的C++实现:
立即学习“C++免费学习笔记(深入)”;
#include <iostream>
#include <vector>
#include <algorithm>
<p>// 观察者接口
class Observer {
public:
virtual ~Observer() = default;
virtual void update(const std::string& message) = 0;
};</p><p>// 被观察者
class Subject {
private:
std::vector<Observer*> observers;</p><p>public:
void attach(Observer* obs) {
observers.push_back(obs);
}</p><pre class='brush:php;toolbar:false;'>void detach(Observer* obs) {
observers.erase(
std::remove(observers.begin(), observers.end(), obs),
observers.end()
);
}
void notify(const std::string& message) {
for (auto* obs : observers) {
obs->update(message);
}
}};
定义两个具体的观察者:
class ConcreteObserverA : public Observer {
public:
void update(const std::string& message) override {
std::cout << "Observer A received: " << message << "\n";
}
};
<p>class ConcreteObserverB : public Observer {
public:
void update(const std::string& message) override {
std::cout << "Observer B received: " << message << "\n";
}
};</p>使用方式:
int main() {
Subject subject;
ConcreteObserverA observerA;
ConcreteObserverB observerB;
<pre class='brush:php;toolbar:false;'>subject.attach(&observerA);
subject.attach(&observerB);
subject.notify("Hello Observers!");
subject.detach(&observerA);
subject.notify("Only B should see this.");
return 0;}
上面的实现存在裸指针管理问题。实际项目中建议使用std::weak_ptr避免悬挂指针,并考虑线程安全。
改用std::shared_ptr和std::weak_ptr:
#include <memory>
#include <list>
<p>class Observer;</p><p>class Subject {
private:
std::list<std::weak_ptr<Observer>> observers;
mutable std::mutex mtx; // 线程安全</p><p>public:
void attach(std::shared_ptr<Observer> obs) {
std::lock_guard<std::mutex> lock(mtx);
observers.remove_if([](const auto& w) { return w.expired(); });
observers.push_back(obs);
}</p><pre class='brush:php;toolbar:false;'>void notify(const std::string& message) {
std::lock_guard<std::mutex> lock(mtx);
observers.remove_if([&](const auto& w) {
if (auto obs = w.lock()) {
obs->update(message);
return false;
}
return true; // 已过期,移除
});
}};
观察者也改为继承 enable_shared_from_this:
class Observer : public std::enable_shared_from_this<Observer> {
public:
virtual ~Observer() = default;
virtual void update(const std::string& message) = 0;
};
观察者模式适合以下场景:
优点包括:
基本上就这些。关键是理解“发布-订阅”思想,用接口隔离变化,再结合现代C++特性提升安全性和可用性。实际项目中也可考虑使用信号槽库(如Boost.Signals2)来简化实现。
以上就是c++++怎么实现一个观察者模式_c++事件通知与解耦机制实现的详细内容,更多请关注php中文网其它相关文章!
c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号