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

C++ 设计模式:观察者模式(Observer Pattern)

链接:C++ 设计模式
链接:C++ 设计模式 - 模板方法
链接:C++ 设计模式 - 策略模式

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

1.问题分析

在开发中,经常会遇到需要在一个对象状态变化时通知其他对象的情况。如果将通知逻辑直接嵌入到主题对象中,会导致代码耦合度高,难以维护和扩展。观察者模式通过将观察者对象和主题对象解耦,使得它们可以独立变化。

2.实现步骤

  1. 定义观察者接口:定义一个接口,包含更新方法。
  2. 定义主题接口:定义一个接口,包含注册、注销和通知观察者的方法。
  3. 实现具体主题类:具体主题类实现主题接口,并维护一个观察者列表。
  4. 实现具体观察者类:具体观察者类实现观察者接口,并在更新方法中实现具体的响应逻辑。

3.代码示例

以机器人电池电量作为示例:

3.1.观察者接口

// 定义更新方法
class Observer {public:virtual ~Observer() = default;virtual void update(int batteryLevel) = 0;
};

3.2. 主题接口

// 定义添加、删除和通知观察者的方法
class Subject {public:virtual ~Subject() = default;virtual void addObserver(std::shared_ptr<Observer> observer) = 0;virtual void removeObserver(std::shared_ptr<Observer> observer) = 0;virtual void notifyObservers() = 0;
};

3.3.具体主题类

// 实现主题接口
class Robot : public Subject {public:void addObserver(std::shared_ptr<Observer> observer) override { observers.push_back(observer); }void removeObserver(std::shared_ptr<Observer> observer) override {observers.erase(std::remove(observers.begin(), observers.end(), observer), observers.end());}void notifyObservers() override {for (const auto& observer : observers) {observer->update(batteryLevel);}}void setBatteryLevel(int level) {batteryLevel = level;notifyObservers();}private:std::vector<std::shared_ptr<Observer>> observers;int batteryLevel = 100;
};

3.4.具体观察者类

// 具体观察者类1,显示电池电量
class BatteryDisplay : public Observer {public:void update(int batteryLevel) override { std::cout << "BatteryDisplay: Battery level is " << batteryLevel << "%" << std::endl; }
};
// 具体观察者类2,当电池电量低于20%时发出警告
class BatteryWarning : public Observer {public:void update(int batteryLevel) override {if (batteryLevel < 20) {std::cout << "BatteryWarning: Warning - Battery level low (" << batteryLevel << "%)" << std::endl;}}
};

3.5.调用算法

int main() {auto robot = std::make_shared<Robot>();auto batteryDisplay = std::make_shared<BatteryDisplay>();auto batteryWarning = std::make_shared<BatteryWarning>();robot->addObserver(batteryDisplay);robot->addObserver(batteryWarning);std::cout << "Setting battery level to 50%" << std::endl;robot->setBatteryLevel(50);std::cout << "\nSetting battery level to 15%" << std::endl;robot->setBatteryLevel(15);return 0;
}
http://www.lryc.cn/news/514314.html

相关文章:

  • 栈及栈的操作
  • 算法:切饼
  • C++ 设计模式:代理模式(Proxy Pattern)
  • JDK、JRE、JVM的区别
  • 2021年福建公务员考试申论试题(县级卷)
  • 问题记录:[FATAL] [1735822984.951119148]: Group ‘manipulator‘ was not found.
  • 【大模型实战篇】Mac本地部署RAGFlow的踩坑史
  • iOS 修改图片颜色
  • OceanBase到MySQL实时同步方案
  • 信息系统项目管理师——第8章章 项目整合管理 笔记
  • 最好用的图文识别OCR -- PaddleOCR(1) 快速集成
  • Unity制作3D场景的脑电运动想象范式(左右手抓握)
  • python23-常用的第三方库01:request模块-爬虫
  • CAT3D: Create Anything in 3D with Multi-View Diffusion Models 论文解读
  • 持续学习入门
  • 天猫推荐数据集实践
  • 《Vue3实战教程》33:Vue3路由
  • 【大模型系列】MultiUI(2024.11)
  • 「Mac畅玩鸿蒙与硬件52」UI互动应用篇29 - 模拟火车票查询系统
  • Dubbo 核心知识全解析:原理、流程与关键机制
  • 时间序列预测算法---LSTM
  • 二十三种设计模式-建造者模式
  • MarkDown 的 mermaid gantt(甘特图)、mermaid sequenceDiagram (流程图) 语法解析和应用
  • git submodule的使用:将别人的git仓库作为自己的子仓库
  • Springboot 下载附件
  • MySQL 延迟复制:确保数据安全与系统稳定的秘诀
  • ELK 使用教程采集系统日志 Elasticsearch、Logstash、Kibana
  • python实现自动登录12306抢票 -- selenium
  • 使用Diffusion Models进行图像超分辩重建
  • 吾杯网络安全技能大赛——Misc方向WP