设计模式 19 观察者模式

ops/2024/9/20 7:36:11/ 标签: 设计模式, 观察者模式

设计模式 19

  • 创建型模式(5):工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式
  • 结构型模式(7):适配器模式、桥接模式、组合模式、装饰者模式、外观模式、享元模式、代理模式
  • 行为型模式(11):责任链模式、命令模式、解释器模式、迭代器模式、中介者模式、备忘录模式、观察者模式、状态模式、策略模式、模板方法模式、访问者模式

文章目录

观察者模式(Observer Pattern)

1 定义

观察者模式的核心思想是当一个对象(被观察者)的状态改变时,所有依赖于它的对象(观察者)都会被通知并更新。这样一来,观察者模式实现了对象之间的松散耦合,使得一个对象的变化可以自动地传播到相关的对象。

2 结构

观察者模式包含以下角色:

  • 主题(Subject): 被观察的对象,维护着一组观察者对象的引用,提供注册、移除观察者的接口,并在状态发生变化时通知所有观察者。
  • 观察者(Observer): 定义一个更新接口,当收到通知时进行相应的更新操作。
  • 具体主题(ConcreteSubject): 具体的被观察对象,通常包含状态,当状态发生变化时,通知所有已注册的观察者。
  • 具体观察者(ConcreteObserver): 实现观察者接口,负责在状态变化时更新自身。

UML 类图

+---------------------------+         +-------------------+
|     Subject               | <------ |     Observer      |
+---------------------------+         +-------------------+
| + Attach(obs: Observer)   |         | + Update(): void  |
| + Detach(obs: Observer)   |         +-------------------+
| + Notify(): void          |               ^
+---------------------------+               |^                                   ||                                   |
+-----------------------+             +-------------------+
| ConcreteSubject       |             | ConcreteObserver  |
+-----------------------+             +-------------------+
| - state: State        |             | - state: State    |
| + GetState(): State   |             | + Update(): void  |
| + SetState(State)     |             +-------------------+
+-----------------------+

3 示例代码

假设我们要实现一个天气站系统,天气站会记录当前的天气信息,并通知注册的显示设备(如手机应用、网站等)进行更新。

观察者接口

// 观察者接口
public interface IObserver
{void Update(string temperature, string humidity, string pressure);
}

主题接口

// 主题接口
public interface ISubject
{void RegisterObserver(IObserver observer);void RemoveObserver(IObserver observer);void NotifyObservers();
}

具体主题

// 具体主题
public class WeatherStation : ISubject
{private List<IObserver> _observers;private string _temperature;private string _humidity;private string _pressure;public WeatherStation(){_observers = new List<IObserver>();}public void RegisterObserver(IObserver observer){_observers.Add(observer);}public void RemoveObserver(IObserver observer){_observers.Remove(observer);}public void NotifyObservers(){foreach (var observer in _observers){observer.Update(_temperature, _humidity, _pressure);}}public void SetMeasurements(string temperature, string humidity, string pressure){_temperature = temperature;_humidity = humidity;_pressure = pressure;NotifyObservers();}
}

具体观察者

// 具体观察者
public class PhoneDisplay : IObserver
{private string _temperature;private string _humidity;private string _pressure;public void Update(string temperature, string humidity, string pressure){_temperature = temperature;_humidity = humidity;_pressure = pressure;Display();}public void Display(){Console.WriteLine($"Phone Display -> Temperature: {_temperature}, Humidity: {_humidity}, Pressure: {_pressure}");}
}public class WebDisplay : IObserver
{private string _temperature;private string _humidity;private string _pressure;public void Update(string temperature, string humidity, string pressure){_temperature = temperature;_humidity = humidity;_pressure = pressure;Display();}public void Display(){Console.WriteLine($"Web Display -> Temperature: {_temperature}, Humidity: {_humidity}, Pressure: {_pressure}");}
}

客户端代码

class Program
{static void Main(string[] args){WeatherStation weatherStation = new WeatherStation();IObserver phoneDisplay = new PhoneDisplay();IObserver webDisplay = new WebDisplay();weatherStation.RegisterObserver(phoneDisplay);weatherStation.RegisterObserver(webDisplay);weatherStation.SetMeasurements("30°C", "65%", "1013 hPa");weatherStation.RemoveObserver(phoneDisplay);weatherStation.SetMeasurements("28°C", "70%", "1012 hPa");}
}

运行结果

Phone Display -> Temperature: 30°C, Humidity: 65%, Pressure: 1013 hPa
Web Display -> Temperature: 30°C, Humidity: 65%, Pressure: 1013 hPa
Web Display -> Temperature: 28°C, Humidity: 70%, Pressure: 1012 hPa

在这个例子中,WeatherStation 是具体的主题,当天气数据发生变化时,它通知所有注册的观察者(如 PhoneDisplayWebDisplay)进行更新并显示新的数据。

4 特点

  • 优点:

    • 松散耦合: 观察者和主题之间是松散耦合的,观察者可以独立于主题的变化而变化,增加了系统的灵活性。

    • 动态更新: 观察者模式使得对象之间的通信更加灵活,可以动态添加或删除观察者,实时更新数据。

    • 符合开放-封闭原则: 可以在不修改现有代码的情况下,增加新的观察者。

  • 缺点:

    • 通知开销: 如果有大量的观察者,通知所有观察者可能会引起开销,影响性能。

    • 可能出现循环依赖: 如果观察者之间也相互依赖,可能会导致循环依赖问题,影响系统的稳定性。

5 适用场景

  • 事件处理系统: 当需要对某个事件发生时,触发多个对象的响应时,观察者模式非常适用。
  • 数据模型与视图同步: 在模型-视图架构中,当模型的数据变化时,需要通知视图更新显示,可以使用观察者模式
  • 广播通信: 当一个对象的状态改变需要通知多个对象时,可以使用观察者模式

6 总结

观察者模式通过定义一对多的依赖关系,实现了对象间的松散耦合和动态通信。它允许对象自动通知相关的依赖对象并更新状态,非常适合用于事件驱动的系统和需要动态更新的场景。尽管可能会带来一定的通知开销和复杂性管理,但它依然是实现对象间动态通信的强大工具。


http://www.ppmy.cn/ops/105973.html

相关文章

性能测试⼯具-——JMeter

目录 JMeter介绍下载JMeter的基本使用流程关键组件介绍常见测试场景与分析方法JMeter插件的扩展7. 结论 JMeter介绍 性能测试是软件开发过程中至关重要的一环&#xff0c;尤其是在当今高并发、大数据的应用场景下。性能测试不仅可以帮助开发团队发现系统的瓶颈&#xff0c;还能…

人工智能顶会IJCAI: 面向惯性传感器信号增强的深度学习架构

近期&#xff0c;哈尔滨工业大学深圳校区赵毅教授与其博士生王一峰带领研究团队设计了一种生成式深度学习架构&#xff0c;它可以显著提升惯性传感器的信号质量。相关成果发表于人工智能顶级会议International Joint Conferences on Artificial Intelligence (IJCAI)&#xff0…

龙兴物联5G物联网主机:开启电力智能化新篇章

在当今时代&#xff0c;电力行业的智能化已成为不可阻挡的趋势。随着社会对电力需求的持续增长以及对供电质量和可靠性要求的不断提高&#xff0c;传统的电力系统管理模式逐渐难以满足需求。 智能化技术的融入为电力系统带来了革命性的变革。通过先进的传感器、通信网络和数据分…

Spring Boot 注解探秘:@Validated 开启数据验证之旅(上)

在 Java Web项目开发中&#xff0c;数据验证是一项至关重要的环节。Spring框架中的Validated注解为我们提供了一种方便而强大的方式来实现数据验证。本文将详细介绍 Validated 注解的用法及其在 Spring Boot 应用中的实践。 一、基本介绍 Validated是 Spring 框架提供的用于数…

JSON格式化?超简单!

JSON格式化 是指将JSON&#xff08;JavaScript Object Notation&#xff09;数据转换成一种更易读、结构化的格式。 在以下场景中&#xff0c;可能需要进行JSON格式化&#xff1a; 调试和开发&#xff1a;在开发过程中&#xff0c;开发人员经常需要查看和解析JSON数据。通过…

实施面试题目

&#xff08;仅供参考&#xff09; 一、网络知识 1.请分别写出网线水晶头568A和568B接法&#xff0c;并解释其用法。 568A通常用于交叉线&#xff0c;即一端使用568A标准&#xff0c;一端使用568B标准&#xff0c;适用于电脑与电脑&#xff08;同种设备&#xff09;之间的直…

uniapp个人健康预警管理系统 微信小程序的设计与实现 38vk1

目录 博主介绍技术栈系统设计&#x1f31f;文末获取源码数据库&#x1f31f;具体实现截图后端前端java类核心代码部分展示可行性论证个人心得系统测试操作可行性源码获取详细视频演示 博主介绍 &#x1f447;&#x1f3fb; 博主介绍&#xff1a;&#x1f447;&#x1f3fb; 专…

ESP8266下载固件→连接阿里云

一、工具准备 1、ESP8266Wifi模块 2、ESP8266下载器 ESP8266-01模块 二、固件配置 CH340串口工具-烧录ESP8266-01固件_esp8266 ch340烧录-CSDN博客文章浏览阅读444次&#xff0c;点赞6次&#xff0c;收藏3次。CH340会有供电不足的问题&#xff0c;因此需要外部供电_esp…

数据结构可视化工具

提示&#xff1a;文章 文章目录 前言一、背景二、 2.1 2.2 总结 前言 前期疑问&#xff1a; 本文目标&#xff1a; 一、背景 有个数据结构可视化的网址 https://pythontutor.com/render.html#modedisplay 二、 2.1 使用pythontutor工具&#xff0c;一打开一个页面看到…

【QNX+Android虚拟化方案】105 - 如何替换 NON-HLOS.bin 中的 Wifi Firmware 固件

【QNX+Android虚拟化方案】105 - 如何替换 NON-HLOS.bin 中的 Wifi Firmware 固件 1、提取 NON-HLOS.bin 中的 Wifi Firmware 出来2、把提取出来的 wifi 固件放到代码中3、重新打包生成 NON-HLOS.bin4、将生成的 NON-HLOS.bin 与 老的 NON-HLOS.bin 对比5、使用fastboot 下载测…

软件开发设计模式的一点个人理解

序言 从最开始买了本《设计模式》吃灰&#xff0c;到自己做了一些软件开发后&#xff0c;又看了一些设计模式的资料&#xff0c;总结一下自己对各种设计模式的理解 创建型模式 1. 单例模式 如果软件运行过程中只存在唯一的实例&#xff0c;就可以使用&#xff0c;访问会很方…

【Android】Material Design编写更好的UI

Toolbar 对于控件ActionBar我们非常熟悉&#xff0c;就是我们常见的标题栏&#xff0c;但ActionBar只能位于活动的顶部&#xff0c;因此我们更建议使用Toolbar。在新建一个项目的时候都是默认显示ActionBar&#xff0c;我们要使用Toolbar就需要先将标题栏改为不显示 先来看看…

Neural Magic发布GuideLLM:评估和优化大型语言模型(LLM)部署的强大工具

大型语言模型&#xff08;LLMs&#xff09;的部署和优化已成为各种应用的关键。Neural Magic推出了GuideLLM&#xff0c;以应对对高效、可扩展且具有成本效益的LLM部署日益增长的需求。这款强大的开源工具旨在评估和优化LLM的部署&#xff0c;以确保它们在满足现实中的推理需求…

高清无损!探索PDF转JPG的最佳实践工具

在信息爆炸的今天&#xff0c;PDF文件因其跨平台兼容性和文档保护特性&#xff0c;成为了工作、学习和日常生活中不可或缺的一部分。但是很多时候我们并不需要精度那么高的文件&#xff0c;图片分享更符合快捷的要求。这次我们就一起探讨有什么PDF转jpg的工具吧。 1.福昕PDF转…

QT实现文本的读写

使用QT读写文件 来&#xff0c;在程序中文件的读写是非常重要的&#xff0c;毕竟我们在大多数时候都是要访问文本文件的&#xff0c;那么今天就来学习一下怎么使用QT来读写文件。 1.写界面 直接在ui界面中编辑即可 布局小技巧我们先选择两个按钮&#xff0c;然后水平布局&am…

代码随想录:63. 不同路径 II

63. 不同路径 II 由于结果较大&#xff0c;所以我们用long long 使用成dp数组的类型。 首先数组初始化&#xff0c;如果起点没有石头&#xff0c;则初始化为1. 然后二维遍历数组&#xff0c;如果该点为石头则跳过&#xff08;该点路径数则为0&#xff09;&#xff0c;否则加…

Nginx服务器权重配置指南:优化负载均衡策略

在Nginx的负载均衡配置中&#xff0c;服务器权重是一个重要的参数&#xff0c;它允许管理员根据后端服务器的处理能力来分配请求的比例。通过设置权重&#xff0c;可以实现更智能的请求分发&#xff0c;提高资源利用率&#xff0c;并确保应用的性能和稳定性。本文将详细介绍如何…

初识RabbitMQ

RabbitMQ是一个开源的消息代理软件&#xff0c;主要用于实现消息队列的功能。它允许应用程序之间通过消息进行异步通信&#xff0c;从而提高系统的可扩展性和可靠性。RabbitMQ支持多种消息协议&#xff0c;最常用的是AMQP&#xff08;高级消息队列协议&#xff09;。 RabbitMQ…

每日刷一刷力扣SQL(八)

185.部门工资前三高的所有员工 考察点&#xff1a;窗口函数的使用 select d.name as Department ,t.name as Employee,t.salary as Salary from (select* ,DENSE_Rank() over(PARTITION BY departmentId order by salary DESC) as rank_idfrom Employee ) t join Department …

【微处理器系统原理和应用设计第六讲】片上微处理器系统系统架构

一、概念辨析 首先来厘清以下概念&#xff1a;微处理器&#xff0c;微控制器&#xff0c;单片机&#xff0c;片上微处理器系统 &#xff08;1&#xff09;微处理器&#xff1a;即MPU&#xff08;Microprocessor Unit&#xff09;&#xff0c;微处理器是一种计算机的中央处理单…