C++如何实现观察者模式_C++常用设计模式之Observer代码示例


观察者模式定义一对多依赖关系,当主题对象状态改变时,所有观察者自动更新;核心角色包括Subject(管理观察者列表并通知)和Observer(定义更新接口);C++实现需定义抽象Observer类、具体Subject类及ConcreteObserver类;示例中Subject维护观察者集合,通过attach/detach添加或移除,状态变化时调用notify通知所有观察者;应用场景含事件系统、GUI通信等,需注意生命周期管理和避免循环引用;可结合std::function提升灵活性。

观察者模式(Observer Pattern)是一种行为设计模式,它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。当主题对象状态发生变化时,所有依赖于它的观察者都会得到通知并自动更新。

核心角色说明

Subject(被观察者):维护观察者列表,提供注册、移除和通知观察者的方法。
Observer(观察者):定义接收通知的接口,具体观察者实现该接口以响应状态变化。

基本实现步骤

在C++中实现观察者模式,通常包含以下几个部分:

  • 定义抽象观察者类(Observer),包含纯虚函数 update()
  • 定义被观察者类(Subject),管理观察者列表,并在状态变化时调用 notify()
  • 具体观察者类继承 Observer,实现自己的 update() 逻辑

代码示例

#include iostream>
#include
#include gorithm>

// 抽象观察者类
class Observer {
public:
    virtual ~Observer() = default;
    virtual void update(const std::string& message) = 0;
};

// 被观察者类
class Subject {
private:
    std::vector observers;
    std::string state;

public:
    void attach(Observer* obs) {
        observers.push_back(obs);
    }

    void detach(Observer* obs) {
        observers.erase(
            std::remove(observers.begin(), observers.end(), obs),
            observers.end()
        );
    }

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

    void setState(const std::string& new_state) {
        state = new_state;
        notify();
    }

    std::string getState() const { return state; }
};

// 具体观察者类
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                  }
};

// 使用示例
int main() {
    Subject subject;
    ConcreteObserver observer1("A");
    ConcreteObserver observer2("B");

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

    subject.setState("State 1");
    // 输出:
    // Observer A received update: State 1
    // Observer B received update: State 1

    subject.detach(&observer2);
    subject.setState("State 2");
    // 只有 A 收到通知

    return 0;
}

使用场景与注意事项

观察者模式常用于事件处理系统、GUI组件通信、模型-视图架构等需要解耦的场景。

  • 避免循环引用,防止无限通知
  • 注意观察者生命周期管理,detach 时确保指针有效
  • 可扩展为支持多类型消息或带参数的通知机制
  • 现代C++可用 std::function 和 lambda 实现更灵活的回调

基本上就这些。观察者模式帮助你实现松耦合的对象间通信,是C++中非常实用的设计模式之一。


# go  # ai  # c++  # ios  # stream  # 架构  # String  # for  # include  # const  # auto  # int  # void  # 循环  # Lambda  # 指针  # 继承  # 虚函数  # 纯虚函数  # 接口  # class  # public  # private  # function  # 对象  # 事件  # default  # 移除  # 自动更新  # 自己的  # 几个  # 是一种  # 多个  # 并在  # 回调  # 需注意  # 更灵活 


相关栏目: 【 Google疑问12 】 【 Facebook疑问10 】 【 网络优化76771 】 【 技术知识130152 】 【 IDC云计算60162 】 【 营销推广131313 】 【 AI优化88182 】 【 百度推广37138 】 【 网站推荐60173 】 【 精选阅读31334


相关推荐: C++如何使用std::optional?(处理可选值)  如何在Mac上搭建Golang开发环境_使用Homebrew安装和管理Go版本  c++中explicit(bool)的用法 c++条件性explicit【C++20】  Windows10蓝屏SYSTEM_SERVICE_EXCEPTION_Win10驱动冲突排查  Win10如何卸载WindowsDefender_Win10卸载Defender教程【方法】  如何在 PHP 单元测试中正确模拟带方法的图像处理门面(Facade)  mac怎么安装字体_MAC添加第三方字体与字体册管理【教程】  Python正则表达式实战_模式匹配说明【教程】  如何使用 Selenium 正确获取篮球参考网站球员名单元素列表  Python文件操作优化_大文件与流处理解析【教程】  C++中的协变与逆变是什么?C++函数指针与返回类型详解【类型系统】  Win11怎么关闭任务栏小图标_Windows11任务栏角溢出设置  如何高效识别并拦截拼接式恶意域名 spam  Python数据挖掘核心算法实践_聚类分类与特征工程  Win11开机自检怎么关闭_跳过Win11开机磁盘扫描修复方法【技巧】  c# 在高并发下使用反射发射(Reflection.Emit)的性能  Windows10系统怎么查看系统版本_Win10运行winver命令查询  如何在Golang中实现RPC异步返回_Golang RPC异步处理与回调方法  用lighttpd能运行php吗_lighttpd配置php步骤【教程】  Python随机数生成_random模块说明【指导】  Windows10电脑怎么连接蓝牙设备_Win10蓝牙配对失败解决方法  Win11怎么恢复误删照片_Win11数据恢复工具使用【推荐】  如何在 Go 中创建包含 map 的 slice(嵌套数据结构)  Win11怎么关闭透明效果_Windows11个性化颜色关闭透明  Win11怎么查看已连接wifi密码 Win11查已连wifi密码步骤【教程】  Windows7如何安装系统镜像_Windows7系统安装教程【步骤】  php命令行怎么运行_通过CLI模式执行PHP脚本的步骤【说明】  Python爬虫项目实战教程_Scrapy抓取与存储数据实例  如何使用Golang template生成文本模板_动态生成HTML或文本  Golang如何避免指针逃逸_Golang逃逸分析与堆栈优化策略  C++中引用和指针有什么区别?(代码说明)  Win11怎么关闭触摸屏_禁用Win11笔记本触摸屏功能设置【教程】  Win11怎样安装搜狗输入法_Win11安装搜狗输入法教程【步骤】  Win11应用商店下载慢怎么办 Win11更改DNS提速下载【修复】  如何用列表一次性对 DataFrame 的指定列应用字典映射  c++中的CRTP是什么 c++奇异递归模板模式【进阶】  Windows家庭版如何开启组策略(gpedit.msc)?(安装方法)  Win11怎么设置默认输入法 Win11固定中文输入法【步骤】  Win10系统更新错误0x80240034怎么办 Win10更新错误解决法【方法】  Win11怎么设置虚拟键盘_打开Win11屏幕键盘操作指南【技巧】  如何在Golang中使用encoding/gob序列化对象_存储和传输数据  PythonFastAPI项目实战教程_API接口与异步处理实践  如何在Golang中使用replace替换模块_指定本地或远程路径  c++ stringstream用法详解_c++字符串与数字转换利器  mac怎么分屏_MAC双屏显示与分屏操作技巧【指南】  短链接怎么自定义还原php_修改解码规则适配需求【汇总】  c# Task.ConfigureAwait(true) 在什么场景下是必须的  php查询数据怎么导出csv_查询结果转csv文件保存【操作】  如何使用Golang实现微服务事件驱动_使用消息总线解耦服务  php会话怎么开启_session_start函数的作用与使用时机【方法】 

 2025-11-23

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

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

点击免费数据支持

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

致胜网络推广营销网


致胜网络推广营销网

致胜网络推广营销网专注海外推广十年,是谷歌推广.Facebook广告全球合作伙伴,我们精英化的技术团队为企业提供谷歌海外推广+外贸网站建设+网站维护运营+Google SEO优化+社交营销为您提供一站式海外营销服务。

 915688610

 17370845950

 915688610@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.