新闻中心
c++怎么实现一个观察者模式_c++观察者设计模式实现示例
观察者模式通过Subject管理Observer列表并在状态变化时通知所有观察者。首先定义Observer抽象类,包含纯虚update方法;Subject类维护Observer指针容器,实现attach、detach和notify方法;ConcreteObserver继承Observer并重写update输出消息;使用时创建Subject和多个ConcreteObserver对象,注册后调用notify触发更新,移除观察者后不再接收通知。需注意指针生命周期安全与迭代中修改的异常风险。该模式适用于事件驱动系统,实现松耦合的一对多依赖关系。

在C++中实现观察者模式,核心是定义一个被观察的对象(Subject),它可以注册、移除和通知多个观察者(Observer)。当被观察对象的状态发生变化时,所有注册的观察者都会自动收到通知。这种设计模式常用于事件处理系统、GUI组件更新、模型-视图架构等场景。
定义观察者接口
观察者通常是一个抽象基类,包含一个更新方法,由具体观察者实现:
class Observer {
public:
virtual ~Observer() = default;
virtual void update(const std::string& message) = 0;
};
定义被观察者(Subject)
Subject负责管理观察者列表,并在状态变化时调用它们的update方法:
#include <vector>
#include <algorithm>
<p>class Subject {
private:
std::vec
tor<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);
}
}};
VALL-E
VALL-E是一种用于文本到语音生成 (TTS) 的语言建模方法
134
查看详情
实现具体观察者
创建具体的观察者类,继承自Observer并实现update逻辑:
class ConcreteObserver : public Observer {
private:
std::string name;
<p>public:
ConcreteObserver(const std::string& n) : name(n) {}</p><pre class='brush:php;toolbar:false;'>void update(const std::string& message) override {
std::cout << name << " 收到消息: " << message << "\n";
}};
使用示例
下面是一个完整的使用例子:
#include <iostream>
#include <memory>
<p>int main() {
Subject subject;
ConcreteObserver observer1("观察者A");
ConcreteObserver observer2("观察者B");</p><pre class='brush:php;toolbar:false;'>subject.attach(&observer1);
subject.attach(&observer2);
subject.notify("状态已更新!");
subject.detach(&observer2);
std::cout << "--- 移除观察者B后 ---\n";
subject.notify("第二次更新");
return 0;}
输出结果为:
观察者A 收到消息: 状态已更新! 观察者B 收到消息: 状态已更新! --- 移除观察者B后 --- 观察者A 收到消息: 第二次更新
注意点:
- 观察者使用裸指针存储,需确保生命周期安全。若Subject生命周期长于观察者,应考虑使用weak_ptr或提供清理机制。
- notify过程中避免在回调里修改观察者列表,否则可能引发迭代器失效。
- 可扩展支持不同消息类型或参数,比如传递具体数据对象。
基本上就这些。这个模式结构清晰,解耦了对象间的依赖,适合一对多的通知场景。
以上就是c++++怎么实现一个观察者模式_c++观察者设计模式实现示例的详细内容,更多请关注其它相关文章!
# 管理机制
# 西安网站推广微馨hfqjwl
# 教育网站建设注意什么
# 大泉州网站优化推广
# 专业关键词排名项目
# 铜陵网络营销推广多少钱
# 杭州正规seo优化代理
# 遂平网络推广营销公司
# 网站推广的指标是什么
# 植保无人机市场推广营销策划方案
# 网站推广方法推荐模板
# 复用
# 多路
# go
# 如何实现
# 何为
# 并在
# 多个
# 是一个
# 都是
# 移除
# stream
# ios
# c++
# ai
相关栏目:
【
科技资讯46185 】
【
网络学院92790 】
相关推荐:
深入理解Promise链:如何在catch后中断then的执行
抓大鹅解压小游戏 抓大鹅摸鱼解压入口
wps文字怎么插入目录并自动更新_wps文字如何插入目录并自动更新方法
Python中高效访问嵌套字典与列表中的键值对
R星幕后开发视频泄露 包含《GTA6》等多款大作
必由学官方网站入口 必由学学生教师共用登录通道
海棠账号登录入口_登录海棠账户同步阅读记录
企业名称高精度匹配:N-gram方法在结构相似性分析中的应用
腾讯视频怎么举报不良内容_腾讯视频内容举报流程与违规信息处理方法
Django表单提交验证失败后保持字段值不刷新
斑马英语APP如何开启夜间护眼阅读_斑马英语APP夜间模式与低蓝光设置教程
初次安装JDK时环境变量如何正确配置_J*A_HOME与PATH设置规则讲解
Pandas DataFrame:高效添加条件计算列
Python字典中优雅地迭代剩余元素的方法
TikTok国际版网页端快速入口 TikTok全球版短视频浏览教程
Bing引擎入口最新2025 Bing搜索免费官方登录
12306选座怎么选到商务座_12306商务座选择与配置说明
谷歌推RCS信息存档功能:公司可监控员工私密信息!
J*aScript 字符串标签转换:使用正则表达式高效替换
豆包手机助手发布技术预览版:直接嵌入手机系统!努比亚样机发售
Vue.js 图片显示异常排查:理解应用挂载范围与DOM ID唯一性
MAC如何安全彻底地删除文件_MAC使用终端命令确保文件无法被恢复
不会效仿卡普空!《铁拳》制作人澄清:不采取赛事付费|直播|
解决Bootstrap卡片顶部边距导致背景图下移的问题
mcjs网页版在线存档 mcjs云存档登录入口
Lar*el递归关系中排除子孙节点的策略
天眼查怎么看公司融资情况 天眼查企业融资历史查询步骤【攻略】
荒野行动PC版怎么注册_荒野行动PC版账号注册详细流程图文教程
React/Next.js中实现列表项的动态移动与状态管理:兼论唯一键的重要性
包子漫画官方网站阅读入口-包子漫画在线漫画官网直达链接
顺丰快件物流信息 官方网站查询入口
uc浏览器网页版入口 uc浏览器网页版最新网址
Pandas DataFrame 多条件优先级排序与排名
基于动态规划的房屋花卉种植最小成本算法详解
使用 Pandas 高效处理 .dat 文件:数据清洗与数值计算实战
抖音未来赚钱的新趋势 2025年值得关注的变现风口分析
win11专注助手在哪 Win11免打扰模式设置与自动化规则【指南】
小米14应用无法联网原因分析_小米14网络权限修复
2025-2030年全球乘用车销量预测:新能源成增长主力
Google翻译怎么语音输入_Google翻译语音输入功能使用与设置方法
淘宝网网页版登录入口 淘宝官方网页版快捷登录
深入理解J*aScript中的B样条曲线与节点向量生成
J*a最大堆Heapify方法修复:索引计算与边界条件深度解析
夸克浏览器图书入口 夸克手机浏览器阅读入口
怎么在浏览器上运行HTML文件_浏览器运行HTML文件技巧【技巧】
Android Studio计算器C键逻辑错误排查与修复:条件判断优化指南
mc.js免安装版 mc.js一键畅玩入口
CSS如何设置hover状态颜色_hover伪类调整背景或文字颜色
QQ邮箱网页版入口 QQ邮箱官方邮箱登录通道
css滚动区域卡顿如何改善_css滚动问题用will-change优化渲染


2025-11-04
浏览次数:次
返回列表
tor<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);
}
}