设计模式-07 设计模式-观察者模式(Observer Pattern)

设计模式-07 设计模式-观察者模式(Observer Pattern)

1.定义


观察者模式是一种软件设计模式,它定义了一种一对多的依赖关系,其中一个对象(称为“主题”)维护了一个依赖对象的列表(称为“观察者”),并且当主题的状态发生变化时,它会自动通知所有观察者。


2.内涵

换句话说,观察者模式允许对象订阅其他对象并接收有关其状态更改的通知。主题对象负责管理观察者列表并通知它们任何状态更改。

涉及到的相关术语:

主题(Subject):维护观察者列表并通知它们状态更改的对象。
观察者(Observer):订阅主题并接收有关其状态更改的通知的对象。
具体主题(Concrete Subject):实现主题接口并维护具体状态和观察者列表的类。
具体观察者(Concrete Observer):实现观察者接口并定义对主题状态更改的响应的类。


工作原理,当观察者模式使用时:

  • 观察者向主题注册,表示他们有兴趣接收状态更改通知。
  • 主题维护一个观察者列表,其中包含所有已注册的观察者。
  • 当主题的状态发生变化时,它会遍历观察者列表并调用每个观察者的 update() 方法。
  • 观察者收到通知并相应地更新自己的状态。
3.使用案例
#include <iostream>
#include <vector>// Observer interface
class Observer {
public:virtual void update(float temperature, float humidity, float pressure) = 0;
};// Subject (WeatherStation) class
class WeatherStation {
private:float temperature;float humidity;float pressure;std::vector<Observer*> observers;public:void registerObserver(Observer* observer) {observers.push_back(observer);}void removeObserver(Observer* observer) {// You can implement the removal logic if needed.}void notifyObservers() {for (Observer* observer : observers) {observer->update(temperature, humidity, pressure);}}void setMeasurements(float temp, float hum, float press) {temperature = temp;humidity = hum;pressure = press;notifyObservers();}
};// Concrete Observer
class Display : public Observer {
public:void update(float temperature, float humidity, float pressure) {std::cout << "Display: Temperature = " << temperature<< "°C, Humidity = " << humidity<< "%, Pressure = " << pressure << " hPa"<< std::endl;}
};int main() {WeatherStation weatherStation;// Create displaysDisplay display1;Display display2;// Register displays as observersweatherStation.registerObserver(&display1);weatherStation.registerObserver(&display2);// Simulate weather data updatesweatherStation.setMeasurements(25.5, 60, 1013.2);weatherStation.setMeasurements(24.8, 58, 1014.5);return 0;
}

4.注意事项

观察者模式的优点包括:

  • 松散耦合:观察者和主题是松散耦合的,这意味着它们可以独立更改而不会影响彼此。
  • 可扩展性:可以轻松地向系统中添加或删除观察者,而不会影响主题或其他观察者。
  • 可重用性:观察者模式可以轻松地应用于不同的应用程序和领域。

观察者模式的缺点包括:

  • 性能开销:当主题的状态经常更改时,通知所有观察者可能会产生性能开销。
  • 通知顺序:观察者模式不保证观察者将按特定顺序收到通知。
  • 内存占用:如果有很多观察者订阅主题,主题需要维护一个很大的观察者列表,这可能会导致内存占用增加。

5.最佳实践
  • 使用接口而不是具体类:主题和观察者接口应该用于定义主题和观察者之间的关系,而不是使用具体类。这提高了代码的可重用性和灵活性。
  • 使用弱引用:观察者应该使用弱引用持有对主题的引用。这可以防止循环引用,并允许在观察者不再需要时自动释放它们。
  • 考虑使用事件对象:事件对象可以用来封装状态更改通知。这可以提供更丰富的通知,其中包含有关状态更改的附加信息。
  • 使用主题层次结构:当需要对不同类型的状态更改进行更精细的控制时,可以使用主题层次结构。这允许观察者只订阅他们感兴趣的特定状态更改。


使用观察者模式,需要考虑优化通知性能,如果主题的状态经常更改,可以使用以下技术来优化通知性能:

  • 使用位掩码或标志来跟踪已更改的状态方面。
  • 批量处理观察者通知。
  • 使用异步通知机制,例如消息队列。
  • 使用线程安全:如果主题或观察者可能从多个线程访问,则需要使用线程安全技术,例如互斥锁或原子操作。
  • 考虑使用第三方库:有许多第三方库提供了观察者模式的实现,可以简化其在应用程序中的使用。

6.总结

仅在需要时使用观察者模式。它可能会引入一些开销和复杂性。心中明白清楚地定义观察者订阅和取消订阅的机制。考虑使用观察者模式的变体,例如发布/订阅模式或模型-视图-控制器 (MVC) 模式。在设计观察者模式时,牢记 SOLID 原则(单一职责、开放/封闭、里氏替换、接口隔离和依赖反转)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/11539.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ssm125四六级报名与成绩查询系统+jsp

四六级报名与成绩查询系统的设计与实现 摘 要 互联网发展至今&#xff0c;无论是其理论还是技术都已经成熟&#xff0c;而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播&#xff0c;搭配信息管理工具可以很好地为人们提供服务。针对四六级报名信息管理混乱&am…

达梦数据插入操作的深坑

提示错误&#xff1a;Only if specified in the column list and SET IDENTITY_INSERT is ON, then identity column could be assigned value 插入的语句采用缺省的方式实现&#xff0c;执行插入操作失败&#xff1b; 原因分析&#xff1a; 1.自增长的SQL表里面插入指定ID的…

DIFT:Emergent Correspondence from Image Diffusion # 论文阅读

URL https://arxiv.org/pdf/2306.03881 主页&#xff1a;https://diffusionfeatures.github.io/ 代码&#xff1a;https://github.com/Tsingularity/dift TD;DR 23 年 6月 cornell 大学的文章&#xff0c;任务是做图片的特征匹配&#xff08;关联&#xff09;&#xff0c;特…

【kali工具使用】Tcpdump 抓包查看三次握手过程

Tcpdump 抓包查看三次握手过程 tcpdump 常用参数&#xff1a; -c 指定要抓取的数据包数量 -n 对 IP 地址以数字方式显式&#xff0c;否则显式为主机名 port 指定端口 -I 指定 tcpdump 需要监听的接口。默认会抓取第一个网络接口 tcp 1ClientSYN1seqx 2Server SYN1 seq…

树莓派|超声波传感器

VCC&#xff1a;超声波模块电源脚&#xff0c;接5V电源即可 Trig&#xff1a;超声波发送脚&#xff0c;高电平时发送出40KHZ出超声波 Echo&#xff1a;超声波接收检测脚&#xff0c;当接收到返回的超声波时&#xff0c;输出高电平 GND&#xff1a;超声波模块GND 测距原理&…

2025考研 | 北京师范大学计算机考研考情分析

北京师范大学&#xff08;Beijing Normal University&#xff09;简称“北师大”&#xff0c;由中华人民共和国教育部直属&#xff0c;中央直管副部级建制&#xff0c;位列“211工程”、“985工程”&#xff0c;入选国家“双一流”、“珠峰计划”、“2011计划”、“111计划”、…

--每周分享--

一、三数之和&#xff1a;15. 三数之和 - 力扣&#xff08;LeetCode&#xff09; public class Solution {public List<List<Integer>> threeSum(int[] nums) {List<List<Integer>> result new ArrayList<>();//判断极限条件&#xff1a;长度不…

NCL绘制WRF domain区域并添加气象站点

读取文件 根据官网例子Using gsn_csm_contour_map to plot WRF-ARW data绘制&#xff1a; ; It shows how to use gsn_csm_xxxx scripts to do the plotting. ; ; You can use the map projection settings on the WRF file, or you ; can use your own map projection. See …

路由器、交换机和网卡

大家使用VMware安装镜像之后&#xff0c;是不是都会考虑虚拟机的镜像系统怎么连上网的&#xff0c;它的连接方式是什么&#xff0c;它ip是什么&#xff1f; 路由器、交换机和网卡 1.路由器 一般有几个功能&#xff0c;第一个是网关、第二个是扩展有线网络端口、第三个是WiFi功…

ncs sdk nrf5340 运行DFU

nrf5340 运行DFU 1. dfu介绍 Nordic 的 DFU&#xff08;Device Firmware Update&#xff09;是一种用于更新设备固件的技术和协议。Nordic Semiconductor 是一家专门设计和制造无线芯片的公司&#xff0c;他们的产品主要用于物联网&#xff08;IoT&#xff09;和无线连接应用…

【数据分析面试】42.用户流失预测模型搭建(资料数据分享)

题目 保持高的客户留存率可以稳定和提到企业的收入。因此&#xff0c;预测和防止客户流失是在业务中常见的一项数据分析任务。这次分享的数据集包括了电信行业、银行、人力资源和电商行业&#xff0c;涵盖了不同业务背景下的流失预测数据。 后台回复暗号&#xff08;在本文末…

整理好了!2024年最常见 100 道 Java基础面试题(四十三)

上一篇地址&#xff1a;整理好了&#xff01;2024年最常见 100 道 Java基础面试题&#xff08;四十二&#xff09;-CSDN博客 八十五、Java 常用的元注解有哪些&#xff1f; 在Java中&#xff0c;元注解&#xff08;Meta-Annotation&#xff09;是指那些用于其他注解上的注解&…

React Native 之 开发环境搭建(一)

1. 安装Node.js&#xff1a; Node.js是React Native开发的基础&#xff0c;因此首先需要安装Node.js。强烈建议始终选择 Node 当前的 LTS &#xff08;长期维护&#xff09;版本&#xff0c;一般是偶数版本&#xff0c;不要选择偏实验性质的奇数版本。 如果你希望更方便地管理…

k8sCRD

k8s&&CRD 概念创建一个简单的自定义资源Operator 概念 CRD: CustomResourceDefinition&#xff0c;CustomResourceDefinition represents a resource that should be exposed on the API server. Its name MUST be in the format <.spec.name>.<.spec.group&…

基于SpringBoot+微信小程序的订餐(点餐)配送系统设计与实现+毕业论文(12000字)

系统介绍 本微信小程序在线订餐系统管理员功能可以修改个人中心&#xff0c;用户管理&#xff0c;菜品分类管理&#xff0c;菜品信息管理&#xff0c;订单信息管理&#xff0c;取消订单管理&#xff0c;订单配送管理&#xff0c;菜品评价管理以及系统管理。微信小程序用户可以…

实训一:设计系统主页作业

1.题目 设计系统主页。 2.目的 (1)熟悉Web前端项目开发环境。 (2)掌握如何建立Web前端项目&#xff0c;学会规划项目结构。 (3)掌握动态生成页面内容的方法。 (4)理解如何使用Flash显示图片新闻。 (5)会在应用系统中编写播放动态新闻的程序。 3.内容 建立项目结构&#xff0c;并…

在excel的内置瀑布图模板中,能在数据标签里同时显示数值和百分比吗?

瀑布图是由麦肯锡顾问公司所创的图表类型&#xff0c;因为形似瀑布流水而称之为瀑布图( Waterfall Plot)。这种图表常用于表达数个特定数值之间的数量增减变化关系。 在Excel中&#xff0c;瀑布图是可以通过簇状柱形图来完成创建。从excel2016版起&#xff0c;excel添加了内置…

【AIGC】Mac Intel 本地 LLM 部署经验汇总(CPU Only)

书接上文&#xff0c;在《【AIGC】本地部署 ollama(gguf) 与项目整合》章节的最后&#xff0c;我在 ollama 中部署 qwen1_5-14b-chat-q4_k_m.gguf 预量化模型&#xff0c;在非 Stream 模式下需要 89 秒才完成一轮问答&#xff0c;响应速度实在是太慢&#xff0c;后续需要想办法…

IT行业现状与未来趋势-技术创新日新月异

目录 一、引言 二、IT行业现状 技术创新日新月异 市场需求持续增长 人才竞争激烈 网络安全问题凸显 三、IT行业未来趋势 人工智能将更加普及 区块链技术将改变商业模式 网络安全将成为重要战略 数字化转型将加速推进 四、结语 一、引言 随着科技的飞速发展&#x…

通过 OmniPlan 4 解决项目管理中的实际问题

项目管理是一个复杂的过程&#xff0c;涉及规划、执行、监控和控制等多个方面。OmniPlan 4作为一款专业的项目管理软件&#xff0c;能够帮助项目经理和团队成员解决实际项目管理中遇到的各种问题。以下是通过OmniPlan 4解决一些常见项目管理问题的介绍。 OmniPlan 4 下载 https…