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

【C++设计模式】行为型模式:观察者模式

文章目录

  • 行为型模式:观察者模式

行为型模式:观察者模式

观察者模式定义了一种一对多的依赖关系:它让一个主题(被观察者)对象关联多个观察者对象,并且当主题对象的状态发生变化时,它会主动通知这些观察者对象,使它们能够自动更新自己或执行相应的响应操作。

以一个设备的温度显示系统为例,在这个示例中,温度检测仪是被观察者,当设备温度发生变化时,它会通知所有的显示器更新温度信息。

#include <iostream>
#include <vector>
#include <string>
#include <algorithm> // 观察者接口
class IObserver {
public:virtual void update(float temperature) = 0;virtual ~IObserver() {}
};// 主题接口(Subject)
class ISubject {
public:virtual void registerObserver(IObserver* observer) = 0;virtual void removeObserver(IObserver* observer) = 0;virtual void notifyObservers() = 0;virtual ~ISubject() {}
};// 被观察者类:设备温度检测仪
class DeviceTemperatureMonitor : public ISubject {
private:std::vector<IObserver*> observers;float temperature;public:// 注册观察者void registerObserver(IObserver* observer) override {observers.push_back(observer);}// 移除观察者void removeObserver(IObserver* observer) override {// std::remove将所有与指定值observer相等的元素移动到容器的末尾,并返回指向第一个不需要保留的元素的迭代器observers.erase(std::remove(observers.begin(), observers.end(), observer), observers.end());}// 通知所有观察者void notifyObservers() override {for (IObserver* observer : observers) {observer->update(temperature);}}// 设置温度状态并通知所有观察者void setTemperature(float temp) {temperature = temp;notifyObservers();}
};// 观察者类:手机显示器
class PhoneDisplay : public IObserver {
private:std::string deviceName;public:PhoneDisplay(const std::string& name) : deviceName(name) {}void update(float temperature) override {std::cout << "Phone Display (" << deviceName << ") - Device Temperature: " << temperature << "°C\n";}
};// 观察者类:窗口显示器
class WindowDisplay : public IObserver {
private:std::string location;public:WindowDisplay(const std::string& loc) : location(loc) {}void update(float temperature) override {std::cout << "Window Display at " << location << " - Device Temperature: " << temperature << "°C\n";}
};int main() {// 创建被观察者对象(设备温度检测仪)DeviceTemperatureMonitor tempMonitor;// 创建观察者对象(显示设备)PhoneDisplay phoneDisplay1("iPhone");PhoneDisplay phoneDisplay2("Samsung");WindowDisplay windowDisplay("Office");// 注册观察者tempMonitor.registerObserver(&phoneDisplay1);tempMonitor.registerObserver(&phoneDisplay2);tempMonitor.registerObserver(&windowDisplay);// 模拟温度数据更新std::cout << "Temperature Update 1:\n";tempMonitor.setTemperature(75.0f);std::cout << "\nTemperature Update 2:\n";tempMonitor.setTemperature(80.0f);// 移除一个观察者tempMonitor.removeObserver(&phoneDisplay2);std::cout << "\nTemperature Update 3 (After removing Samsung Phone Display):\n";tempMonitor.setTemperature(85.0f);return 0;
}
Temperature Update 1:
Phone Display (iPhone) - Device Temperature: 75°C
Phone Display (Samsung) - Device Temperature: 75°C
Window Display at Office - Device Temperature: 75°CTemperature Update 2:
Phone Display (iPhone) - Device Temperature: 80°C
Phone Display (Samsung) - Device Temperature: 80°C
Window Display at Office - Device Temperature: 80°CTemperature Update 3 (After removing Samsung Phone Display):
Phone Display (iPhone) - Device Temperature: 85°C
Window Display at Office - Device Temperature: 85°C
http://www.lryc.cn/news/458962.html

相关文章:

  • 本篇5K,立志最细,FreeRtos中的信号量Semaphore教程详解!!!
  • 【Postman】接口测试工具使用
  • springboot 整合 rabbitMQ(1)
  • Appium Device Farm安装教程
  • 异常、基类
  • VScode 自定义代码配色方案
  • MuMu模拟器12 KitsumeMask安装教程
  • Perforce静态分析工具2024.2新增功能:Helix QAC全新CI/CD集成支持、Klocwork分析引擎改进和安全增强
  • 太阳能电池特性及其应用
  • 日语学习零基础生活日语口语柯桥外语学校|股票用日语怎么说?
  • 第2关:寻找一个序列中的第K小的元素(即第k小元问题)
  • docker 搭建 vue3 + vite
  • 【网易云音乐】--源代码分享
  • 股市大涨下的会展业创新者
  • 工具篇-完整的 Git 项目管理工具教程(在命令框中使用 Git、在 IDEA 中使用 Git)
  • 关于Amazon Linux 2023的版本及包管理器
  • Java面向对象编程--高级
  • Vert.x,Web - 静态资源/模板
  • OpenAI今天Open了一下:开源多智能体框架Swarm
  • 车辆重识别(2021NIPS无分类器扩散指南)论文阅读2024/10/08
  • JavaSE——认识异常
  • 嵌入式数据结构中顺序栈用法
  • PE结构之绑定导入表
  • 【python学习】1-2 配置python系统环境变量
  • 日均千万订单的交易平台设计稿
  • 如何在 iPad 上恢复已删除的历史记录?
  • Haar cascade训练人脸小模型做人脸辨别
  • DBA | 如何将 .mdf 与 .ldf 的数据库文件导入到SQL Server 数据库中?
  • 【差分数组】个人练习-Leetcode-3229. Minimum Operations to Make Array Equal to Target
  • HTML5--裸体回顾