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

C++二十三种设计模式之观察者模式

C++二十三种设计模式之观察者模式

  • 一、组成
  • 二、目的
  • 三、缺点
  • 四、示例代码

一、组成

抽象主题:维护观察者对象列表,具备通知功能。
具体主题:实现维护观察者对象列表具体策略和通知功能。
抽象观察者:为主题类提供更新接口。
具体观察者:实现更新接口。

二、目的

用于一个对象状态发生变化,所有依赖于它的对象都自动收到通知并进行更新。

三、缺点

1、资源浪费问题,存在大量观察者时,通知所有观察者会导致不需要此消息的观察者也收到这个消息。
2、通知顺序不确定,如果观察者之间需要存在先后收到通知的依赖关系时会有问题、

四、示例代码

#include<iostream>
#include <vector>
#include <string>
using namespace std;

class WeatherObserver;//抽象观察者类
class WeatherApp;//具体观察者类
class AbstractWeatherStation;//抽象主题类
class WeatherStation;//具体主题类

class WeatherObserver {
public:
	virtual void updateWeather(const string weatherName) = 0;
};

class WeatherApp :public WeatherObserver {
public:
	explicit WeatherApp(const string appName) :appName(appName) {};
	void updateWeather(const string weatherName) {
		weatherCur = weatherName;
		printCurWeather();
	}
	void printCurWeather() {
		cout << "The current weather on thre " << appName << " app is " << weatherCur << endl;
	}
private:
	string weatherCur;
	string appName;
};

class AbstractWeatherStation {
public:
	virtual void addObserver(shared_ptr<WeatherObserver> observer) = 0;
	virtual void removeObserver(shared_ptr<WeatherObserver> observer) = 0;
	virtual void notifyObservers() = 0;
protected:
	vector<shared_ptr<WeatherObserver>> observers;
};

class WeatherStation :public AbstractWeatherStation {
public:
	void addObserver(shared_ptr<WeatherObserver> observer) {
		observers.push_back(observer);
	}
	void removeObserver(shared_ptr<WeatherObserver> observer) {
		observers.erase(remove(observers.begin(), observers.end(), observer), observers.end());
	}
	void notifyObservers() {
		for (const auto& observer : observers) {
			observer->updateWeather(weatherCur);
		}
	}
	void updateWeather(const string& weather) {
		weatherCur = weather;
		notifyObservers();
	}
private:
	vector<shared_ptr<WeatherObserver>> observers;
	string weatherCur;
};

int main() {
	shared_ptr<WeatherObserver> app1 = make_shared<WeatherApp>("天气宝app");
	shared_ptr<WeatherObserver> app2 = make_shared<WeatherApp>("气象通app");
	shared_ptr<WeatherStation> weatherStation = make_shared<WeatherStation>();
	weatherStation->addObserver(app1);
	weatherStation->addObserver(app2);
	weatherStation->updateWeather("晴天");

	weatherStation->removeObserver(app1);

	weatherStation->updateWeather("雨天");

}

http://www.kler.cn/a/474306.html

相关文章:

  • java mail 535 Login Fail. Please enter your authorization code to login
  • CDP集成Hudi实战-Hive
  • c++类和对象---上
  • 机器学习免费使用的数据集及网站链接
  • 多模态大模型初探索:通过ollama部署多模态大模型
  • 使用WPF在C#中制作下载按钮
  • 强化学习入门谈
  • Linux C/C++编程-UDP套接字编程示例
  • 微软人工智能研究院推出OLA-VLM:一种以视觉为中心的方法来优化多模态大型语言模型
  • Redis Stream
  • Git指令
  • 一文读懂单片机的串口
  • 基于R语言的DICE模型实践技术应用;评估气候变化对经济的影响以及不同减排政策的经济成本和效益
  • Dify进阶:使用FastAPI和Selenium构建远程浏览器控制与录屏服务
  • 蓝桥杯python省赛备战day2--数组枚举--845数组中的最长山脉-枚举算法刷题学习笔记3--leetcode
  • NoSQL 基础知识总结
  • python【数据结构】
  • RabbitMQ中的配置文件advanced.config
  • 配置嵌入式服务器
  • Vue3 监听属性
  • [豆包MarCode AI 刷题] 算法题解 Java 青训入营考核 五题打卡第一天
  • git commit冲突,需输入提交信息合并提交
  • 服务器端QTcpSocket如何判断客户端是否在线
  • linux MySQL Percona Toolkit 使用指南
  • 【Pandas】pandas Series truediv
  • 系统架构设计师考点—数据库技术基础