c++如何实现观察者设计模式_c++设计模式之观察者模式实现方法


观察者模式通过抽象基类定义更新接口,被观察者维护观察者列表并通知其状态变化。使用指针管理依赖关系时需注意生命周期,避免悬空指针,推荐结合智能指针提升安全性。

观察者模式是一种行为设计模式,用于在对象之间定义一对多的依赖关系,当一个对象的状态发生改变时,所有依赖它的对象都会自动收到通知。在C++中,可以通过抽象基类和指针或引用管理观察者来实现这一模式。

定义观察者接口

观察者角色通常由一个抽象基类表示,其中包含一个更新函数,所有具体观察者都需要实现该函数。

  • 定义一个纯虚函数 update(),供被观察者调用以通知状态变化
  • 观察者可以是任意数量的具体类,只需继承该接口即可
class Observer {
public:
    virtual ~Observer() = default;
    virtual void update() = 0;
};

定义被观察者(主题)类

被观察者负责维护观察者列表,并在状态变化时通知它们。

  • 使用容器(如 std::vector)存储观察者指针
  • 提供添加、删除和通知观察者的方法
  • 注意避免空指针或悬空指针问题
#include 
#include 

class Subject {
private:
    std::vector observers;

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();
        }
    }
};

实现具体观察者

具体观察者实现自己的响应逻辑,比如打印信息或更新自身状态。

  • 继承 Observer 类并重写 update()
  • 可以在构造时注册到某个被观察者
class ConcreteObserver : public Observer {
private:
    int observerId;

public:
    ConcreteObserver(int id) : observerId(id) {}

    void update() override {
        std::cout << "Observer " << observerId << " received update!\n";
    }
};

完整示例与使用

将上述部分组合,演示如何注册多个观察者并触发通知。

#include 

int main() {
    Subject subject;
    ConcreteObserver obs1(1);
    ConcreteObserver obs2(2);

    subject.attach(&obs1);
    subject.attach(&obs2);

    subject.notify();  // 输出两条消息

    subject.detach(&obs1);
    subject.notify();  // 只有 obs2 收到通知

    return 0;
}

基本上就这些。通过抽象接口和动态绑定,C++能很好地支持观察者模式。关键是管理好生命周期,避免野指针。如果需要更安全的管理,可以用 std::weak_ptr 配合 std::shared_ptr 实现自动清理。


# go  # ai  # c++  # ios  # stream  # red  # 指针  # 继承  # 虚函数  # 纯虚函数  # 接口  # 空指针  # 对象  # 自己的  # 这一  # 很好  # 是一种  # 多个  # 可以用  # 只需  # 并在  # 可以通过  # 两条 


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


相关推荐: Win11屏幕亮度突然变暗怎么解决_自动变暗问题处理  Win10如何更改开机密码_Windows10登录选项更改密码  Mac的“调度中心”与“空间”怎么用_Mac多桌面高效管理【技巧】  如何使用Golang reflect检查方法数量_动态分析类型方法  Win11 C盘满了怎么清理 Win11磁盘清理和存储感知使用教程【新手必看】  如何使用Golang实现文件追加操作_向已有文件追加数据  Windows怎样关闭锁屏广告_Windows关闭锁屏广告方法【教程】  Python字符串操作教程_切片拼接与格式化详解  Python数据挖掘进阶教程_分类回归与聚类案例解析  Windows 11如何开启文件夹加密(EFS)_Windows 11文件属性中加密内容以保护数据  如何在JavaScript中动态拼接PHP的base_url与jQuery变量  C#怎么创建控制台应用 C# Console App项目创建方法  Win11任务栏颜色怎么改_Win11自定义任务栏配色设置【美化】  php订单日志怎么导出excel_php导出订单日志到表格教程【教程】  Windows10怎样设置家长控制_Windows10家长控制设置方法【指南】  php错误怎么开启_display_errors与log_errors的设置【汇总】  GML (Geography Markup Language)是什么,它如何用XML来表示地理空间信息?  c++中的CRTP是什么 c++奇异递归模板模式【进阶】  Win11怎么关闭应用权限_Windows11相机麦克风隐私管理  php485返回数据不完整怎么办_php485数据分包重组处理方法【教程】  mac怎么退出id_MAC退出iCloud账号与Apple ID切换【指南】  Win11搜索不到蓝牙耳机怎么办 Win11蓝牙驱动更新修复【详解】  c++ std::atomic如何保证原子性 c++ CAS操作原理【底层】  如何提升Golang程序I/O性能_Golang I/O密集型程序优化示例  Windows10系统服务优化指南_Win10禁用不必要服务提升性能  Windows10如何重置此电脑_Windows10电脑重置方法【步骤】  PythonGIL机制理解_多线程限制解析【教程】  如何使用Golang实现微服务事件驱动_使用消息总线解耦服务  Windows10如何更改计算机工作组_Win10系统属性修改Workgroup  Win11任务栏天气怎么关闭 Win11隐藏天气小组件图标【设置】  php转mp4怎么设置帧率_调整php生成mp4视频帧率说明【说明】  Golang如何遍历目录文件_Golang filepath.Walk目录遍历操作方法  Win11怎么关闭边缘滑动手势_Windows11禁用触摸屏边缘操作  Windows蓝屏错误0x0000002C怎么解决_系统IO异常排查方法  Win11怎么关闭右下角弹窗_Win11拦截系统通知广告【设置】  Win11怎么查看显卡显存_查询Win11显卡详细参数方法【步骤】  Python如何创建带属性的XML节点  Win11怎么连接投影仪_Win11多显示器投屏设置指南【步骤】  如何在Golang中使用encoding/gob序列化对象_存储和传输数据  如何在 Go 中高效缓存与分发网络视频流  如何在Golang中处理二进制数据_Golang io与encoding/binary二进制操作方法  如何在同包不同文件中正确引用 Go 结构体  Win11怎么更改文件夹图标_自定义Win11文件夹外观样式【详解】  MAC如何隐藏文件夹及文件_MAC终端命令隐藏与第三方工具加密【教程】  Windows10系统怎么查看设备管理器_Win10快捷键Win+X菜单使用  php查询数据怎么分组_groupby分组查询配合聚合函数【技巧】  Win11怎么开启自动HDR画质_Windows11显示设置HDR选项  如何在Golang中实现并发消息队列消费者_Golang channel消息消费实践  如何在Golang中定义接口_抽象方法和多态实现  Win10电脑怎么设置IP地址_Windows10网络属性固定IP配置 

 2025-12-13

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

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

点击免费数据支持

提交您的需求,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.