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

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

一、组成

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

二、目的

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

三、缺点

1、资源浪费问题,存在大量观察者时,通知所有观察者会导致不需要此消息的观察者也收到这个消息。

2、通知顺序不确定,如果观察者之间需要存在先后收到通知的依赖关系时会有问题、

四、示例代码

javascript 复制代码
#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("雨天");

}
相关推荐
油炸自行车9 分钟前
【Qt】编写Qt自定义Ui控件步骤
开发语言·c++·qt·ui·自定义ui控件·qt4 自定义ui控件
呱呱巨基2 小时前
C/C++ 内存管理
c++·笔记·学习
半桔2 小时前
【网络编程】TCP 服务器并发编程:多进程、线程池与守护进程实践
linux·服务器·网络·c++·tcp/ip
橘子132 小时前
C++实战:搜索引擎项目(二)
开发语言·c++·搜索引擎
不一样的少年_3 小时前
Vue3 后台分页写腻了?我用 1 个 Hook 删掉 90% 重复代码(附源码)
前端·vue.js·设计模式
应用市场3 小时前
Qt C++ 图形绘制完全指南:从基础到进阶实战
开发语言·c++·qt
A阳俊yi3 小时前
设计模式——七大常见设计原则
设计模式
青草地溪水旁3 小时前
设计模式(C++)详解—单例模式(2)
c++·单例模式
bkspiderx3 小时前
C++时区操作全版本指南(含C++03/C++11-17/C++20)
linux·开发语言·c++·c++20·时区
序属秋秋秋4 小时前
《C++进阶之STL》【哈希表】
数据结构·c++·stl·哈希算法·散列表·哈希表·哈希