当前位置: 首页 > backend >正文

c++ 观察者模式 订阅发布架构

#include <iostream>
#include <vector>
#include <algorithm>
#include <memory>
#include <mutex>// 观察者接口
class IObserver {
public:virtual ~IObserver() = default;virtual void update(const std::string& message) = 0;
};// 主题接口
class ISubject {
public:virtual ~ISubject() = default;virtual void attach(std::shared_ptr<IObserver> observer) = 0;virtual void detach(std::shared_ptr<IObserver> observer) = 0;virtual void notify(const std::string& message) = 0;
};// 具体主题实现
class ConcreteSubject : public ISubject {
private:std::vector<std::shared_ptr<IObserver>> observers_;std::mutex mutex_;std::string state_;public:void attach(std::shared_ptr<IObserver> observer) override {std::lock_guard<std::mutex> lock(mutex_);observers_.push_back(observer);}void detach(std::shared_ptr<IObserver> observer) override {std::lock_guard<std::mutex> lock(mutex_);observers_.erase(std::remove(observers_.begin(), observers_.end(), observer),observers_.end());}void notify(const std::string& message) override {std::vector<std::shared_ptr<IObserver>> observers_copy;{std::lock_guard<std::mutex> lock(mutex_);observers_copy = observers_;}for (auto& observer : observers_copy) {observer->update(message);}}void setState(const std::string& state) {state_ = state;notify("State changed to: " + state);}std::string getState() const {return state_;}
};// 具体观察者实现
class ConcreteObserver : public IObserver, public std::enable_shared_from_this<ConcreteObserver> {
private:std::string name_;std::weak_ptr<ISubject> subject_;public:ConcreteObserver(const std::string& name, std::shared_ptr<ISubject> subject): name_(name), subject_(subject) {subject->attach(shared_from_this());}~ConcreteObserver() {if (auto subject = subject_.lock()) {subject->detach(shared_from_this());}}void update(const std::string& message) override {std::cout << "Observer " << name_ << " received: " << message << std::endl;}
};// 使用示例
int main() {auto subject = std::make_shared<ConcreteSubject>();auto observer1 = std::make_shared<ConcreteObserver>("Observer1", subject);auto observer2 = std::make_shared<ConcreteObserver>("Observer2", subject);subject->setState("Active");subject->setState("Inactive");return 0;
}

http://www.xdnf.cn/news/18928.html

相关文章:

  • Visual Scope (Serial_Digital_Scope V2) “串口 + 虚拟示波器” 工具使用记录
  • JavaScript中的BOM,DOM和事件
  • Spring Boot 实战:接入 DeepSeek API 实现问卷文本优化
  • 底层音频编程的基本术语 PCM 和 Mixer
  • 数据分析学习笔记4:加州房价预测
  • 腕上智慧健康管家:华为WATCH 5与小艺的智美生活新范式
  • 音频转PCM
  • curl、python-requests、postman和jmeter的对应关系
  • AR培训系统:油气行业的安全与效率革新
  • frp 一个高性能的反向代理服务
  • PAT 1086 Tree Traversals Again
  • SpringBoot项目使用Liquibase 数据库版本管理
  • C#编译错误:CS1056 意外字符
  • vsgCs显示谷歌全球倾斜模型-节点
  • 第八章:《性能优化技巧》——深入讲解预分配容量、移动语义、避免频繁拼接等优化策略,以及C++17的`string_view`如何减少拷贝开
  • vxetable数据导出
  • UGUI源码剖析(13):交互的基石——Selectable状态机与Button事件
  • Kafka 4.0 五大 API 选型指南、依赖坐标、上手示例与最佳实践
  • 项目实战4:TrinityCore框架学习
  • 科技守护古树魂:古树制茶行业的数字化转型之路
  • 把llamafacoty微调后的模型导出ollama模型文件
  • 【前端教程】JavaScript入门核心:使用方式、执行机制与核心语法全解析
  • Oracle 数据库权限管理的艺术:从入门到精通
  • 目标检测领域基本概念
  • 第6篇:链路追踪系统 - 分布式环境下的请求跟踪
  • JSP程序设计之JSP指令
  • 【Python】QT(PySide2、PyQt5):Qt Designer,VS Code使用designer,可能的报错
  • Java学习笔记之——通过分页查询样例感受JDBC、Mybatis以及MybatisPlus(一)
  • 上海控安:汽车API安全-风险与防护策略解析
  • Java 实现HTML转Word:从HTML文件与字符串到可编辑Word文档