观察者模式通过定义Subject和Observer接口实现对象间一对多的依赖关系,当Subject状态变化时自动通知所有Observer。示例中使用shared_ptr管理观察者列表,ConcreteSubject在事件发生时调用notify通知所有注册的ConcreteObserver,输出对应消息,支持动态注册与注销,具备良好扩展性,适用于事件处理系统。

在C++中实现观察者模式(Observer Pattern)的核心是建立一种一对多的依赖关系,使得当一个对象(被观察者)状态发生变化时,所有依赖它的对象(观察者)都能自动收到通知。这种机制常用于事件处理系统、GUI组件通信、消息订阅等场景。
观察者模式基本结构
观察者模式包含两个主要角色:
Subject(被观察者):维护观察者列表,提供注册、注销和通知接口。 Observer(观察者):定义一个更新接口,被通知时执行相应操作。
下面是一个简洁、可复用的C++实现示例:
1. 定义抽象观察者和被观察者接口
#include #include #include #include // 抽象观察者class Observer {public: virtual ~Observer() = default; virtual void update(const std::string& message) = 0;};// 抽象被观察者class Subject {public: virtual ~Subject() = default; virtual void attach(std::shared_ptr observer) = 0; virtual void detach(std::shared_ptr observer) = 0; virtual void notify(const std::string& message) = 0;};
2. 实现具体被观察者(事件源)
具体被观察者持有一个观察者列表,并在状态变化时调用 notify 发送消息。
立即学习“C++免费学习笔记(深入)”;
class ConcreteSubject : public Subject {private: std::vector<std::shared_ptr> observers;public: void attach(std::shared_ptr observer) override { observers.push_back(observer); } void detach(std::shared_ptr observer) override { observers.erase( std::remove(observers.begin(), observers.end(), observer), observers.end() ); } void notify(const std::string& message) override { for (const auto& obs : observers) { obs->update(message); } } // 模拟事件触发 void eventHappened(const std::string& event) { std::cout << "[Subject] Event occurred: " << event << "n"; notify(event); }};
3. 实现具体观察者
每个观察者实现自己的 update 逻辑,响应通知。
class ConcreteObserver : public Observer {private: std::string name;public: ConcreteObserver(const std::string& n) : name(n) {} void update(const std::string& message) override { std::cout << "[Observer " << name << "] Received: " << message << "n"; }};
4. 使用示例
将观察者注册到被观察者,触发事件后自动通知所有观察者。
int main() { auto subject = std::make_shared(); auto obs1 = std::make_shared("Alice"); auto obs2 = std::make_shared("Bob"); subject->attach(obs1); subject->attach(obs2); subject->eventHappened("User logged in"); subject->detach(obs2); subject->eventHappened("Data updated"); return 0;}
输出结果:
[Subject] Event occurred: User logged in[Observer Alice] Received: User logged in[Observer Bob] Received: User logged in[Subject] Event occurred: Data updated[Observer Alice] Received: Data updated
扩展建议
使用 std::weak_ptr 避免循环引用或悬挂指针(特别是在观察者生命周期短于被观察者时)。 支持不同类型的消息(如枚举事件类型),让观察者选择性处理。 引入线程安全机制(如互斥锁)用于多线程环境。 使用函数对象(std::function)实现更灵活的回调机制,适合轻量级事件系统。
基本上就这些。这个结构清晰、易于扩展,适用于大多数C++项目中的事件通知需求。
以上就是C++观察者模式 事件通知机制实现的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1471973.html
微信扫一扫
支付宝扫一扫