首页 > 编程语言 >C++二十三种设计模式之观察者模式

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

时间:2025-01-08 13:03:43浏览次数:12  
标签:observer void 观察者 C++ observers shared 设计模式 ptr

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("雨天");

}

标签:observer,void,观察者,C++,observers,shared,设计模式,ptr
From: https://blog.csdn.net/qq_45297613/article/details/145006013

相关文章

  • 【C++】特殊类设计和C++的类型转换
    ......
  • C++ const关键字(八股总结)
    作用const修饰符用来定义常量,具有不可变性。修饰变量,说明该变量不可以被改变;修饰指针,分为指向常量的指针(pointertoconst)和自身是常量的指针(常量指针,constpointer);修饰引用,指向常量的引用(referencetoconst),用于形参类型,即避免了拷贝,又避免了函数对值的修改;修饰成员函数,......
  • 启航数据结构算法之绮旅,漫步C++智慧之道——LeetCode题海探幽:轮转数组之多元策略演绎
    人无完人,持之以恒,方能见真我!!!共同进步!!文章目录复杂度练习之轮转数组方法1方法2方法3总结复杂度练习之轮转数组题目链接:轮转数组为什么我们把这道题作为复杂度的练习题呢?是因为我们以后做题都会涉及到复杂度的计算,我们要保证我们写的程序不会超出题目的时间......
  • 10.28软件设计——抽象工厂模式之人与肤色 c++
    1、类图 2、源代码 test4.cpp  #include<iostream>#include<string>usingnamespacestd; //抽象产品类男人classMan{public: virtualvoidmakeM()=0;};//具体产品类白色男人classWhiteMan:publicMan{public: voidmakeM() { cout......
  • 1.3.1 C++新特性
    文章目录1.3.1C++新特性1.智能指针1.为什么要用智能指针2.三种智能指针对比3.shared_ptr1.使用智能指针可以自动释放占用的内存2.共享所有权指针的传播和释放3.常用函数4.要注意的问题4.unique_ptr5.weak_ptr弱引用的智能指针1.基本用法2.weak_ptr返回this指......
  • C++STL<unordered_map>
    在C++中,<unordered_map>是一种基于哈希表的关联容器,它存储键值对,并且不保证元素的排序。以下是unordered_map的一些常用函数及其使用方式:插入元素:insert(constvalue_type&val)或insert(initializer_listinit)用于插入元素。std::unordered_map<int,std::string......
  • C++头文件map
    在C++中,<map>头文件提供了一种关联容器,它存储的是键值对(std::pair),并且会自动根据键进行排序。以下是一些常用的map函数及其使用方式:插入元素:insert(constvalue_type&val)或insert(initializer_listinit)用于插入元素。std::map<int,std::string>myMap;myMap.......
  • Java设计模式 —— 【行为型模式】命令模式(Command Pattern) 详解
    文章目录模式介绍优缺点适用场景结构案例实现注意事项模式介绍有时候需要向某些对象发送请求,但是并不知道请求的接收者是谁,也不知道被请求的操作是什么。此时希望用一种松耦合的方式来设计程序,使得请求发送者和请求接收者能够消除彼此之间的耦合关系。拿订餐来说......
  • Head First 设计模式(中文版)PDF、EPUB免费下载
    电子版仅供预览,下载后24小时内务必删除,支持正版,喜欢的请购买正版书籍点击原文去下载书籍信息作者:ElisabethFreeman//EricFreeman/BertBates/KathySierra/ElisabethRobson/[美]MaryEleanorFreeman出版社:中国电力出版社译者:O'ReillyTaiwan公司出......
  • 解锁编程智慧:23种设计模式案例分享
    为什么要学习设计模式?你可以把设计模式想象成一些做饭的菜谱。当我们需要做一道菜(开发一个功能)时,如果按照自己的想法随意添加调料(编写代码),很可能做出的菜味道不好(功能不稳定或有bug)。但是,如果我们按照一个成功的菜谱(设计模式)来做,就能更容易地做出美味的菜肴(开发出稳定的功能)。......