c++如何实现观察者设计模式_c++行为型设计模式实战


观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听一个主题对象,当主题状态改变时自动通知所有观察者进行更新;其核心角色包括Subject(维护观察者列表并负责注册、移除和通知)和Observer(定义更新接口),通过C++示例展示了具体实现结构,包含ConcreteSubject和ConcreteObserver类,并演示了消息广播与解注册行为;实际应用中建议结合智能指针避免内存问题,使用std::function提升灵活性,注意线程安全与生命周期管理,适用于GUI事件、消息总线等解耦场景。

c++如何实现观察者设计模式_c++行为型设计模式实战

观察者模式是一种常用的行为型设计模式,它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。当主题对象状态发生变化时,会通知所有观察者,使它们自动更新。

核心角色说明

在观察者模式中有两个主要角色:

  • 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> observer) = 0;
virtual void detach(Observer</em> observer) = 0;
virtual void notify() = 0;
virtual void setMessage(const std::string& message) = 0;
virtual std::string getMessage() const = 0;
};</p><p>// 具体被观察者
class ConcreteSubject : public Subject {
private:
std::vector<Observer*> observers;
std::string message;</p><p>public:
void attach(Observer* observer) override {
observers.push_back(observer);
}</p><pre class='brush:php;toolbar:false;'>void detach(Observer* observer) override {
    observers.erase(
        std::remove(observers.begin(), observers.end(), observer),
        observers.end()
    );
}

void notify() override {
    for (auto* obs : observers) {
        obs->update(message);
    }
}

void setMessage(const std::string& msg) override {
    message = msg;
    notify();
}

std::string getMessage() const override {
    return message;
}

};

Viggle AI Video Viggle AI Video

Powerful AI-powered animation tool and image-to-video AI generator.

Viggle AI Video 115 查看详情 Viggle AI Video

// 具体观察者 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 update: " << message << "\n";
}

};

使用示例

测试代码展示如何注册观察者并触发通知:

int main() {
    ConcreteSubject subject;
<pre class='brush:php;toolbar:false;'>ConcreteObserver observer1("A");
ConcreteObserver observer2("B");

subject.attach(&observer1);
subject.attach(&observer2);

subject.setMessage("Hello Observers!");

// 输出:
// Observer A received update: Hello Observers!
// Observer B received update: Hello Observers!

subject.detach(&observer2);
subject.setMessage("Only A should see this.");

// 只有 A 收到消息
return 0;

}

实际应用场景建议

在真实项目中,可以结合智能指针和回调机制增强安全性与灵活性:

  • 使用 std::shared_ptr<observer></observer> 避免悬空指针问题。
  • 通过 std::function<void std::string></void> 实现函数式观察者,简化回调逻辑。
  • 在线程安全场景下,对观察者列表的操作应加锁保护。

基本上就这些。观察者模式适合解耦事件源与响应逻辑,广泛用于GUI事件系统、消息总线或状态同步等场景。关键是管理好生命周期,避免野指针或重复通知。不复杂但容易忽略细节。

以上就是c++++如何实现观察者设计模式_c++行为型设计模式实战的详细内容,更多请关注其它相关文章!


# 实际应用  # 银川问答营销推广怎么做  # 黄骅seo网络营销推广外包  # 网站周日有必要优化吗  # 霍林郭勒网站seo优化  # 常州网络推广网站公司  # 休闲网站建设联系方式  # 网站网络推广的阶段  # app推广.remerge再营销  # seo怎么学引流  # 青羊区网站建设制作技术  # 多路  # 管理机制  # go  # 移除  # 何为  # 回调  # 多个  # 都是  # 如何实现  # AI-powered  # red  # stream  # ios  # c++  # ai 


相关栏目: 【 Google疑问12 】 【 Facebook疑问10 】 【 优化推广96088 】 【 技术知识133117 】 【 IDC资讯59369 】 【 网络运营7196 】 【 IT资讯61894


相关推荐: 抖音号怎么解除企业认证改成个人?改成个人有影响吗?  拷贝漫画2025网页版入口 拷贝漫画官网免费看全集  小米civi如何设置锁屏时间  搜狗浏览器如何查找页面中的文字 搜狗浏览器Ctrl+F页面搜索功能  《爱笔思画x》涂色教程  键盘保修需要什么_键盘售后维修流程  研招网官方网站正版登录网址_中国研究生招生信息网官网首页  MacBook Pro词典使用指南  C++中std::thread和std::async的区别_C++并发编程与线程与异步任务比较  百度网盘网页入口链接分享 百度网盘官网入口网页登录  firefox火狐浏览器最新官网主页_ firefox火狐浏览器平台入口直达官方链接  无人机考证官网 中国民航无人机考证官网登录入口  Flexbox布局:实现粘性导航与底部页脚的完美结合  使用VS Code调试Python代码:从入门到精通  家里的小飞虫总是不断,用什么方法可以彻底根除?  《tt语音》超级玩家开通方法  Leaflet地图弹出窗口图片动态显示:避免缺失图标的专业指南  哔哩哔哩在线观看入口 B站官网免费进入  荣耀 Magic10 Pro 系统更新提示失败_荣耀 Magic10 Pro 升级修复  SQL聚合查询、联接与筛选:GROUP BY 子句的正确使用与常见陷阱  《深林》冬季章节图文攻略  谷歌浏览器官网地址整理_谷歌浏览器新版直连2026稳定访问  Microsoft Edge网页字体太淡看不清怎么办_Microsoft Edge字体渲染优化技巧  realme 10 Pro息屏方案_realme 10 Pro省电策略  ao3入口镜像地址 ao3镜像入口可靠跳转  《火影忍者:木叶高手》快速升级攻略  wps文字怎么设置文字环绕图片的方式_wps文字如何设置文字环绕图片方式  composer licenses 命令:如何检查项目依赖的许可证?  如何在mysql中设计餐饮点餐系统_mysql点餐系统项目实战  解决J*aScript动态图片上传中ID重复问题:在同一页面显示多张独立图片  PPT页面尺寸怎么修改 PPT自定义幻灯片大小与方向设置【教程】  Vue 3中独立响应式实例的创建与应用  KFC邀请码怎么使用领额外优惠_KFC邀请码输入方式与额外优惠代码获取方法  TikTok笔记文字无法编辑如何解决 TikTok笔记文字编辑优化方法  J*aScript二进制处理_ArrayBuffer与Blob  TikTok网页版入口快速访问 TikTok官网账号登录方法  AO3中文入口稳定分享_AO3官网HTTPS看文详解  邮政快递寄件查询入口 邮政快递收件查询入口  Python中对象引用与链表属性赋值的机制解析  《U校园》学生登录入口2025  猫眼app抢票快还是小程序快  《律学法考》查看学习数据方法  PHP多语言网站的实现:会话管理与翻译函数优化教程  苹果手机缓存怎么清除_苹果手机缓存如何清除iphone各版本操作步骤  电脑的“恢复环境(WinRE)”找不到怎么办_Windows系统恢复环境重建【高级修复】  解决CSS容器溢出问题:使用calc()实现精确布局与边距控制  发布小红书怎么屏蔽粉丝?屏蔽粉丝能看到吗?  c++类和对象到底是什么_c++面向对象编程基础  C++ bind函数使用教程_C++参数绑定与函数适配器的应用  Windows Audio服务启动失败怎么办_电脑没声音的终极服务修复法【修复】 

 2025-11-29

了解您产品搜索量及市场趋势,制定营销计划

同行竞争及网站分析保障您的广告效果

点击免费数据支持

提交您的需求,1小时内享受我们的专业解答。

运城市盐湖区信雨科技有限公司


运城市盐湖区信雨科技有限公司

运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。

 8156699

 13765294890

 8156699@qq.com

Notice

We and selected third parties use cookies or similar technologies for technical purposes and, with your consent, for other purposes as specified in the cookie policy.
You can consent to the use of such technologies by closing this notice, by interacting with any link or button outside of this notice or by continuing to browse otherwise.