news 2026/4/15 18:11:21

c++设计模式-观察者模式

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
c++设计模式-观察者模式

一.概念


观察者设计模式属于行为型设计模式,又称发布-订阅模式,定义了对象间的一对多依赖关系,被观察对象状态发生变化时,所有订阅它的观察对象都会受到通知并自动更新。

二.原理

1.Subject(被观察者)

包含观察者对象的集合,提供增加、删除、通知观察者对象的抽象接口。

2.ConcreteSubject(具体的被观察者)

Subject抽象类接口的具体实现,维护观察者列表,并将变化通知所有观察者。

3.Observer(观察者)

接收Subject通知的对象,订阅Subject的状态,并提供更新操作的统一抽象接口。

4.ConcreteObserver(具体的观察者)

Observer抽象类接口的具体实现,提供了更新操作的具体实现,收到subject通知后进行更新操作。

三.特点

1.优势

  • 符合开闭原则的要求。
  • 支持广播的通信方式。
  • 动态添加观察者,代码扩展性好。

2.劣势

  • 每次状态变化都要遍历所有观察者,性能开销大。
  • 每次状态变化都要通知所有观察者,通信时间长。
  • 观察者数量过多使代码的可读性变差。

四.代码实现

1.demo1-传参通知

#include<iostream>#include<vector>usingnamespacestd;//抽象类classObserver{public:virtualvoidupdate(intdata)=0;//纯虚函数};classConcreteObserver:publicObserver{public:ConcreteObserver(string name){m_sName=name;}voidupdate(intdata){cout<<m_sName<<" received data:"<<data<<endl;}private:string m_sName;};classSubject{public:virtualvoidattach(Observer*observer)=0;virtualvoiddetach(Observer*observer)=0;virtualvoidnotify(intdata)=0;};classConcreteSubject:publicSubject{public:voidattach(Observer*observer){observers.push_back(observer);}voiddetach(Observer*observer){for(autoit=observers.begin();it!=observers.end();it++){if(*it==observer){observers.erase(it);break;}}}voidnotify(intdata){for(autoit=observers.begin();it!=observers.end();it++){(*it)->update(data);}}private:vector<Observer*>observers;};intmain(){cout<<"observer demo1!"<<endl;ConcreteObserverobserver1("observer1");ConcreteObserverobserver2("observer2");ConcreteObserverobserver3("observer3");ConcreteSubject subject;subject.attach(&observer1);subject.attach(&observer2);subject.attach(&observer3);subject.notify(10);subject.detach(&observer1);subject.notify(20);return0;}

2.demo2-模拟天气预报

#include<iostream>#include<vector>usingnamespacestd;classObserver{public:virtualvoidupdate(floattemperature,floathumidity,floatpressure)=0;};classDisplay:publicObserver{public:voidupdate(floattemperature,floathumidity,floatpressure){cout<<"Temperature:"<<temperature<<"℃, Humidity:"<<humidity<<"%, Pressure:"<<pressure<<"hPa"<<endl;}};classWeatherStation{private:floatm_fTemperature;floatm_fHumidity;floatm_fPressure;vector<Observer*>m_vObservers;public:voidattach(Observer*observer){m_vObservers.push_back(observer);}voiddetach(Observer*observer){for(autoit=m_vObservers.begin();it!=m_vObservers.end();it++){if(*it==observer){m_vObservers.erase(it);break;}}}voidnotify(){for(autoit=m_vObservers.begin();it!=m_vObservers.end();it++){(*it)->update(m_fTemperature,m_fHumidity,m_fPressure);}}voidsetValue(floattemp,floathum,floatpress){m_fTemperature=temp;m_fHumidity=hum;m_fPressure=press;notify();}};intmain(){std::cout<<"observer demo2!"<<std::endl;WeatherStation weatherStation;Display display1;Display display2;weatherStation.attach(&display1);weatherStation.attach(&display2);weatherStation.setValue(25.5,50,103);weatherStation.setValue(25.7,60,152);return0;}

五.运行结果

1.demo1-传参通知

observer demo1!observer1 received data:10 observer2 received data:10 observer3 received data:10 observer2 received data:20 observer3 received data:20

2.demo2-模拟天气预报

observer demo2!Temperature:25.5℃, Humidity:50%, Pressure:103hPa Temperature:25.5℃, Humidity:50%, Pressure:103hPa Temperature:25.7℃, Humidity:60%, Pressure:152hPa Temperature:25.7℃, Humidity:60%, Pressure:152hPa
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/16 10:57:32

11个AI论文工具,支持LaTeX排版与多维度内容优化

工具对比排名 工具名称 核心优势 支持LaTeX 适用场景 aibiye AIGC率降个位数&#xff0c;兼容知网规则 是 AI痕迹强处理 aicheck 学术改写优化&#xff0c;语义保留佳 是 格式统一化 askpaper 降重降AI一体&#xff0c;20分钟快速响应 是 初稿优化 秒篇 人类特…

作者头像 李华
网站建设 2026/4/15 15:16:16

11种AI论文创作助手,提供LaTeX排版与语义优化双重支持

工具对比排名 工具名称 核心优势 支持LaTeX 适用场景 aibiye AIGC率降个位数&#xff0c;兼容知网规则 是 AI痕迹强处理 aicheck 学术改写优化&#xff0c;语义保留佳 是 格式统一化 askpaper 降重降AI一体&#xff0c;20分钟快速响应 是 初稿优化 秒篇 人类特…

作者头像 李华
网站建设 2026/4/16 12:22:48

智能化的11类论文辅助工具,兼容LaTeX并实现高效内容升级

工具对比排名 工具名称 核心优势 支持LaTeX 适用场景 aibiye AIGC率降个位数&#xff0c;兼容知网规则 是 AI痕迹强处理 aicheck 学术改写优化&#xff0c;语义保留佳 是 格式统一化 askpaper 降重降AI一体&#xff0c;20分钟快速响应 是 初稿优化 秒篇 人类特…

作者头像 李华
网站建设 2026/4/16 12:28:51

一种基于STM32的智能门锁系统的设计

第二章 整体方案设计 2.1 需求分析 搭建简单的智能门锁系统作品&#xff0c;需要相应的硬件与软件结合&#xff0c;本设计基于STM32的智能门锁系统主要实现的功能要求有&#xff1a; (1)显示屏显示操作界面&#xff1b; (2)使用者可以通过设置按键进入管理界面&#xff0c;可以…

作者头像 李华
网站建设 2026/4/16 12:21:41

解决AI生成重复内容问题:十大工具深度分析及实用改进方案

核心工具对比速览 工具名称 核心功能 适用场景 处理速度 特色优势 aibiye 降AIGC率查重 学术论文优化 20分钟 适配知网/格子达/维普规则 aicheck AIGC检测 风险区域识别 实时 可视化热力图报告 askpaper 学术内容优化 论文降重 20分钟 保留专业术语 秒篇 …

作者头像 李华