行为型模式 | 观察者模式

一、观察者模式

1、原理

观察者模式又叫做发布-订阅(Publish/Subscribe)模式,定义了一种一对多的依赖关系。让多个观察者对象同时监听某一个主题对象,这个主题对象在状态上发生变化时,会通知所有观察者对象,使它们能够自动更新自己。

软件系统常常要求在某一个对象的状态发生变化的时候,某些其它的对象做出相应的改变。观察者模式是解决该类问题的很优秀的方案,使用该模式减少对象之间的耦合,提升系统的可扩展性。

2、关键角色

观察者模式有下面几个关键的角色,如下:

  • 抽象主题(Subject):抽象主题提供一组接口,可以增加和删除观察者对象,每个主题都可以有任何数量的观察者
  • 具体主题(ConcreteSubject):保存注册的观察者及主题自身的状态,当主题的状态发生变化时通知观察者
  • 抽象观察者(Observer):为所有的具体观察者定义一个接口,在得到主题的通知时更新自己
  • 具体观察者(ConcreteObserver):保存主题的状态,实现抽象观察者所要求的更新接口,以便使本身的状态与主题的状态保持一致

3、UML类图

下面是观察者模式对应的UML类图,如下:

在这里插入图片描述

4、使用场景

适用场景

  • 对象间存在一对多关系,一个对象的状态发生改变会影响其他对象
  • 实现类似广播机制的功能,不需要知道具体收听者,只需分发广播,系统中感兴趣的对象会自动接收该广播

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

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

相关文章

Camunda Rest API

客户端像调用本地方法一样调用引擎中的接口。 https://docs.camunda.org/manual/7.17/reference/rest/ 一&#xff1a;pom.xml <dependency><groupId>org.camunda.community.rest</groupId><artifactId>camunda-platform-7-rest-client-spring-boot-…

【Kafka-3.x-教程】-【三】Kafka-Broker、Kafka-Kraft

【Kafka-3.x-教程】专栏&#xff1a; 【Kafka-3.x-教程】-【一】Kafka 概述、Kafka 快速入门 【Kafka-3.x-教程】-【二】Kafka-生产者-Producer 【Kafka-3.x-教程】-【三】Kafka-Broker、Kafka-Kraft 【Kafka-3.x-教程】-【四】Kafka-消费者-Consumer 【Kafka-3.x-教程】-【五…

【Docker】概述与安装

&#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 接下来看看由辉辉所写的关于Docker的相关操作吧 目录 &#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 一. Docker的概述 1.Docker为什么出现 2…

【设计模式-7】门面模式的代码实现和应用场景

门面模式&#xff0c;最简单的结构性设计模式&#xff0c;将多个不同的子系统逻辑封装起来&#xff0c;对外提供统一的调用接口。门面模式又叫做外观模式&#xff0c;可能是我们接触最多的模式&#xff0c;在开发中&#xff0c;可能不经意间就用到了门面模式。 1. 概述 门面模…

设计模式之组合模式【结构型模式】

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档> 学习的最大理由是想摆脱平庸&#xff0c;早一天就多一份人生的精彩&#xff1b;迟一天就多一天平庸的困扰。各位小伙伴&#xff0c;如果您&#xff1a; 想系统/深入学习某…

极客时间-读多写少型缓存设计

背景 内容是极客时间-徐长龙老师的高并发系统实战课的个人学习笔记&#xff0c;欢迎大家学习&#xff01;https://time.geekbang.org/column/article/596644 总览内容如下&#xff1a; 缓存性价比 一般来说&#xff0c;只有热点数据放到缓存才更有价值 数据量查询频率命中…

Dubbo接口测试没你想的那么高大上

主题&#xff1a;Dubbo接口测试没你想的那么高大上 一、Dubbo是什么&#xff1f; Dubbo是阿里巴巴公司开源的一个高性能优秀的服务框架一款分布式服务框架、高性能和透明化的RPC远程服务调用方案、SOA服务治理方案下图是阿里巴巴技术解决方案演变图&#xff0c;从单应用->…

CAN201 计网概念收集

Lecture 1 the theoretical basis for networking Network edge and core 地理覆盖范围&#xff1a;广WAN&#xff0c;城MAN&#xff0c;局LAN&#xff0c;个PAN 交换方式&#xff0c;电路&#xff0c;报文&#xff0c;分组 电路交换vs报文vs分组 Network performance pr…

文件上传进阶绕过技巧(一)和靶场实战

★★免责声明★★ 文章中涉及的程序(方法)可能带有攻击性&#xff0c;仅供安全研究与学习之用&#xff0c;读者将信息做其他用途&#xff0c;由Ta承担全部法律及连带责任&#xff0c;文章作者不承担任何法律及连带责任。 0、环境准备 请移步《文件上传靶场实战&#xff1a;upl…

倍福CX8090嵌入式PLC新风控制开发

实现新风系统控制的方法与硬件配置、软件编程以及控制需求等因素有关。以下是一个简化的示例&#xff0c;说明如何使用倍福CX8090 PLC来实现新风系统的控制&#xff1a; 硬件配置&#xff1a; 倍福CX8090 PLC温度和湿度传感器风阀执行器显示屏软件编程&#xff1a; 使用倍福的…

深度解析Java中的ReadWriteLock:高效处理并发读写操作

第1章&#xff1a;引言 大家好&#xff0c;我是小黑&#xff0c;今天咱们聊聊读写锁。当多个线程同时对同一数据进行读写操作时&#xff0c;如果没有合理的管理&#xff0c;那数据就乱套了。就好比小黑在写日记&#xff0c;突然来了一帮朋友&#xff0c;大家都想往日记本上写点…

从头安装与使用一个docker GPU环境

GPU版docker的安装与使用 欢迎使用GPU版docker安装使用说明使用官方教程安装docker新建一个GPU版docker环境调用docker环境执行本地python文件 欢迎使用GPU版docker安装使用说明 使用官方教程安装docker 导入源仓库的GPG key curl -fsSL https://download.docker.com/linux/…