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

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.dtcms.com/a/354805.html

相关文章:

  • FFmpeg05:编解码实战
  • 机器学习框架下:金价近3400关口波动,AI量化模型对PCE数据的动态监测与趋势预测
  • 企业通讯软件以安全为基,搭建高效的通讯办公平台
  • RA4M2环境搭建与新建工程
  • 新手向:Python开发简易股票价格追踪器
  • Linux内核IPv4 RAW套接字深度解析:从数据包构造到可靠传输的挑战
  • Dify 和 LangChain 区别对比总结
  • 【实操教学】ArcGIS 如何进行定义坐标系
  • Python实现点云基于法向量、曲率和ISS提取特征点
  • 【GM3568JHF】FPGA+ARM异构开发板 使用指南:显示与触摸
  • 第二章:Cesium 视图控制与相机操作
  • Java集合操作:Apache Commons Collections4启示录
  • React中优雅管理CSS变量的最佳实践
  • iOS文件管理在uni-app开发中的实战应用,多工具解决
  • 三、计算机网络与分布式系统(上)
  • Subdev与Media子系统的数据结构
  • 线程池及线程池单例模式
  • 图数据库neo4j的安装
  • Go语言数组完全指南
  • 基于Springboot的酒店房间预订系统源码
  • More Effective C++ 条款13:以by reference方式捕捉exceptions
  • [Mysql数据库] 知识点总结5
  • 【C++游记】物种多样——谓之多态
  • 49个Docker自动化脚本:覆盖全场景运维,构建高可用容器体系
  • 【C初阶】文件操作
  • Claude Code 流畅使用指南
  • java中sleep与wait的区别
  • ES基础知识
  • PostgreSQL15——常用函数
  • docker一键部署!强大的本地音乐服务器NAS-Music