观察者模式通过Subject维护Observer列表实现一对多依赖,当状态变化时自动通知所有观察者;代码中ConcreteSubject用vector存储Observer指针,调用notify遍历执行update,输出显示注册的观察者接收消息,移除后不再通知。

在C++中实现观察者模式(Observer Pattern),核心是定义一种一对多的依赖关系,让多个观察者对象同时监听一个主题对象。当主题状态发生变化时,所有注册的观察者都会自动收到通知并更新。
Subject(被观察者):维护观察者列表,提供注册、注销和通知接口。
Observer(观察者):定义接收通知的接口,通常是一个纯虚函数。
当主题状态改变时,调用通知方法,遍历所有观察者并调用其更新函数。
下面是一个简洁但完整的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 {
public:
virtual ~Subject() = default;
virtual void attach(Observer<em> obs) = 0;
virtual void detach(Observer</em> obs) = 0;
virtual void notify(const std::string& message) = 0;
};</p><p>// 具体被观察者
class ConcreteSubject : public Subject {
private:
std::vector<Observer*>
; observers;
std::string state;</p><p>public:
void setState(const std::string& s) {
state = s;
notify(state);
}</p><pre class='brush:php;toolbar:false;'>std::string getState() const {
return state;
}
void attach(Observer* obs) override {
observers.push_back(obs);
}
void detach(Observer* obs) override {
observers.erase(
std::remove(observers.begin(), observers.end(), obs),
observers.end()
);
}
void notify(const std::string& message) override {
for (Observer* obs : observers) {
obs->update(message);
}
}};
// 具体观察者 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 << name << " 收到通知: " << message << "\n";
}};
演示如何注册观察者并触发通知:
Musho
AI网页设计Figma插件
76
查看详情
int main() {
ConcreteSubject subject;
<pre class='brush:php;toolbar:false;'>ConcreteObserver observer1("观察者A");
ConcreteObserver observer2("观察者B");
subject.attach(&observer1);
subject.attach(&observer2);
subject.setState("系统状态已更新!");
subject.detach(&observer2);
subject.setState("第二次更新,只有A会收到");
return 0;}
输出结果:
观察者A 收到通知: 系统状态已更新!
观察者B 收到通知: 系统状态已更新!
观察者A 收到通知: 第二次更新,只有A会收到
使用裸指针时需确保观察者生命周期长于被观察者,否则可能引发悬空指针。若需更安全的管理,可改用智能指针(如std::weak_ptr)结合信号槽机制,或使用std::shared_ptr配合enable_shared_from_this。
基本上就这些。这种实现方式简单直观,适合理解模式本质,也可根据项目需求扩展支持异步通知、事件过滤等功能。
以上就是c++++中如何实现一个观察者模式_Observer设计模式的实现思路与代码示例的详细内容,更多请关注其它相关文章!
相关文章:
Go语言中Map存储的结构体如何调用指针方法:深入解析与实践
如何在J*a中实现统一对象行为接口_项目大型化时的接口规范化
PHP高效扁平化嵌套数组:使用array_merge与数组解包操作符
抖音未来赚钱的新趋势 2025年值得关注的变现风口分析
ArrayList与LinkedList核心操作的Big-O复杂度分析
离线运行Go语言之旅:本地部署与GOPATH配置指南
poki网页游戏推荐_poki免费游戏平台入口
高德地图沿途添加点失败如何解决 高德多点规划方法
NVIDIA股价11月重挫12%:下月有望好转 但难回5万亿美元巅峰
谷歌浏览器浏览体验优化_谷歌浏览器新版直连永久可用提示
React Hooks最佳实践:动态组件状态管理的组件化方案
如何优雅地扩展SprykerGlue后端API授权逻辑,使用spryker/glue-backend-api-application-authorization-connector-extension
优化Lar*el Docker镜像:Composer与PHP版本控制策略
冬*霸灯泡不亮怎么办_浴霸取暖灯一盏不亮的灯座清洁修复法
CSS条件样式无法按设备触发怎么排查_media条件语句正确设置解决触发问题
如何让 composer 信任自签名的 HTTPS 证书源?
如何将HTML表格多行数据保存到Google Sheets
怎么去除衣服上的口红印_生活小妙招教你用酒精轻松擦除
优化 Jest 模拟:强制未实现函数抛出错误以提升测试效率
wps文字怎么插入目录并自动更新_wps文字如何插入目录并自动更新方法
妖精动漫免费平台 妖精动漫官网资源观看网址
印象笔记如何设提醒任务防漏执行_印象笔记设提醒任务防漏执行【任务提醒】
HTML空白字符处理机制:渲染、DOM与编码实践
Yandex浏览器官方网页版入口 Yandex浏览器最新版官网
Log4j Console Appender性能瓶颈与高并发优化策略
J*aScript类型检查_j*ascript代码规范
1688商家版怎样分析买家画像精准供货_1688商家版分析买家画像精准供货【供货策略】
如何在离线环境中使用Composer_Composer离线安装依赖包的技巧与策略
c++中的const_cast和reinterpret_cast怎么用_c++四种类型转换
理解Python模块与全局变量的作用域管理
深入理解Go语言中的指针类型:以*string为例
Yandex免登录官网入口_俄罗斯Yandex搜索引擎直达链接
J*aScript中高效清空DOM列表元素:解决for循环中断与任务管理问题
qq音乐在线播放入口_qq音乐电脑版登录链接
海棠电脑版入口_通过电脑访问海棠官网阅读
C++如何跨平台操作文件和目录_C++17标准库std::filesystem的使用教程
C++编译期如何执行复杂计算_C++模板元编程(TMP)技巧与应用
网易大神怎么保存别人动态的图片_网易大神动态图片保存方法
苹果手机如何防止被恶意App追踪
Golang如何实现简单的Web表单_Golang表单提交与验证处理方法
Win10桌面图标出现小盾牌怎么办 Win10去除UAC图标教程【解决】
c++如何使用折叠表达式(Fold Expressions)_c++17可变参数模板新技巧
如何在Promise链中有效终止错误处理后的执行
解决 Vaadin 8 中大文件音频播放与定位时出现的 IOException
iCloud登录入口网页版 苹果iCloud官网登录
将PCM16音频数据转换为W*并编码为Base64教程
Sublime Text怎么显示空格和制表符_Sublime显示不可见字符设置
lar*el怎么安全地存储和获取配置文件中的敏感信息_lar*el敏感信息安全存储方法
飞书妙记怎样用语音转文字速记_飞书妙记用语音转文字速记【速记方法】
php源码怎么看淘宝客系统_看php源码淘宝客系统技巧