当前位置: 首页 > news >正文

设计模式19——观察者模式

写文章的初心主要是用来帮助自己快速的回忆这个模式该怎么用,主要是下面的UML图可以起到大作用,在你学习过一遍以后可能会遗忘,忘记了不要紧,只要看一眼UML图就能想起来了。同时也请大家多多指教。

观察者模式(Observer),又名:发布-订阅模式(publish-subscribe)

是一种行为型模式。因为叫发布-订阅模式更容易理解,所以下面说明时大多情况会使用发布-订阅这个名称。

目录

一、概述

1.1、直观的理解:

1.2、主要角色:

1.3、描述对象之间关系的UML图:

1.4、适用场景:

二、简单举例

2.1、对象之间的关系用UML图表示如下:

2.2、Java代码如下:


一、概述

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

1.1、直观的理解

(注:关于发布者何时给订阅者通知更新,这个需要结合实际情况来考虑) 

1.2、主要角色:

  • 发布者(目标主题):发布者的抽象类或接口 + 发布者类
  • 订阅者(观察者):订阅者的抽象类或接口 + 订阅者类

1.3、描述对象之间关系的UML图:

1.4、适用场景:

  • 一个抽象模型有两个方面,其中一个方面依赖另一个方面。可以将它们封装独立出来
  • 对一个对象的改变需要同时改变其他对象
  • 一个对象必须通知其他对象,而且其他对象并不是固定不变的

二、简单举例

假设 客户端 要让 发布者 设置自己的状态为hello,再然后通知 张三 和 李四 这两个 订阅者 。例子简单就不再详细分析了。你可以把这当做一个模板,然后灵活使用:

2.1、对象之间的关系用UML图表示如下:

2.2、Java代码如下:

订阅者的抽象类:

abstract class Subscriber {public abstract void update();//接收发布者的消息
}

发布者的抽象类:

abstract class Publisher {private List<Subscriber> list; //链表public Publisher() {//初始化this.list = new LinkedList<>();}public void attach(Subscriber subscriber) { //增加订阅者list.add(subscriber);}public void detach(Subscriber subscriber) {//删除订阅者list.remove(subscriber);}public void notifySubscriber() {//通知订阅者for (Subscriber subscriber : list) {subscriber.update();}}private String publisherState;//发布者状态public String getPublisherState() {//得到发布者状态return this.publisherState;}public void setPublisherState(String publisherState) {//设置发布者状态this.publisherState = publisherState;}
}

具体的发布者A:

public class ConcretePublisherA extends Publisher{//发布者的其它方法
}

具体的订阅者1:

public class ConcreteSubscriber1 extends Subscriber {private String name;//订阅者名称private Publisher publisher;//发布者public ConcreteSubscriber1(String name, Publisher publisher) {//初始化this.name = name;this.publisher = publisher;}@Overridepublic void update() {//接收发布者的消息System.out.println("订阅者是:" + this.name + ",发布者的状态为:" + this.publisher.getPublisherState());}
}

主程序(发起请求的类):

public class Main {public static void main(String[] args) {Publisher publisher = new ConcretePublisherA();Subscriber subscriber1 = new ConcreteSubscriber1("张三", publisher);Subscriber subscriber2 = new ConcreteSubscriber1("李四", publisher);publisher.attach(subscriber1);publisher.attach(subscriber2);publisher.setPublisherState("hello!");//通知订阅者publisher.notifySubscriber();}
}

这里就不再举例了,可以把上面的Java例子复制到你本地,运行main函数试一下加深理解。这些代码都是我自己学习的时候根据一些教材手敲的,不存在bug可以直接运行。

如果觉得本文还不错,就请点个赞给作者一点鼓励吧!如果有建议,也请评论指教和讨论!

相关文章:

设计模式19——观察者模式

写文章的初心主要是用来帮助自己快速的回忆这个模式该怎么用&#xff0c;主要是下面的UML图可以起到大作用&#xff0c;在你学习过一遍以后可能会遗忘&#xff0c;忘记了不要紧&#xff0c;只要看一眼UML图就能想起来了。同时也请大家多多指教。 观察者模式&#xff08;Observ…...

C++算术运算和自增自减运算

一 引言 表示运算的符号称为运算符。 算术运算&#xff1b; 比较运算&#xff1b; 逻辑运算&#xff1b; 位运算&#xff1b; 1 算术运算 算术运算包括加、减、乘、除、乘方、指数、对数、三角函数、求余函数&#xff0c;这些都是算术运算。 C中用、-、*、/、%分别表示加、减…...

Python深度学习:【模型系列】一文搞懂Transformer架构的三种注意力机制

文章目录 1. 什么是注意力机制?2. Transformer 的注意力层2.1 注意力机制基础2.2 理解Q,K,V2.3 交叉注意力层2.4 全局自注意力层2.5 因果注意力层3. 位置编码4. 多头注意力机制5. 总结1. 什么是注意力机制? 注意力机制最初受到人类视觉注意力的启发,目的是让模型在处理大…...

微服务架构中Java的应用

在微服务架构中&#xff0c;Java是一种非常常用的编程语言。Java生态系统非常庞大&#xff0c;有许多框架和工具可以用来构建和管理微服务。 以下是一些在微服务架构中使用Java编写的应用程序的示例&#xff1a; Spring Boot和Spring Cloud&#xff1a;Spring Boot是一种用于快…...

【强训笔记】day25

NO.1 思路&#xff1a;哈希质数判断。 代码实现&#xff1a; #include <iostream> #include<string> #include<cmath> using namespace std;bool isprime(int n) {if(n<2) return false;for(int i2;i<sqrt(n);i){if(n%i0) return false;}return true…...

知识产权与标准化

知识产权与标准化 导航 文章目录 知识产权与标准化导航一、知识产权概述二、保护范围与对象三、保护期限四、知识产权归属五、侵权判定六、标准的分类 一、知识产权概述 知识产权:知识产权是指人们就其智力劳动成果所依法享有的专有权利&#xff0c;通常是国家赋予创造者对其…...

【LeetCode:2769. 找出最大的可达成数字 + 模拟】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…...

编程5年的老哥说:我代码里从来不用锁,谁爱...

技多不压身&#xff01; 大家好&#xff0c;我是 javapub。 今天一个朋友找我吐槽&#xff0c;说自己平时在工作中几乎用不到需要上锁的场景&#xff0c;就算有也只是并发很小、或者直接从有业务设计上就规避掉了。但一到面试&#xff0c;都是各种锁题&#xff0c;很头疼。 面…...

CogAgent:开创性的VLM在GUI理解和自动化任务中的突破

尽管LLMs如ChatGPT在撰写电子邮件等任务上能够提供帮助&#xff0c;它们在理解和与GUIs交互方面存在挑战&#xff0c;这限制了它们在提高自动化水平方面的潜力。数字世界中的自主代理是许多现代人梦寐以求的理想助手。这些代理能够根据用户输入的任务描述自动完成如在线预订票务…...

C++容器之位集(std::bitset)

目录 1 概述2 使用实例3 接口使用3.1 constructor3.2 count_and_size3.3 test3.4 any3.5 none3.6 all3.7 set3.8 reset3.9 filp3.10 to_string3.11 to_ulong3.12 to_ullong3.13 operators1 概述 位集存储位(只有两个可能值的元素:0或1,true或false,…)。   该类模拟bool…...

《Ai学习笔记》自然语言处理 (Natural Language Processing):常见机器阅读理解模型(上)02

Glove 词向量&#xff1a; 在机器理解中的词的表示&#xff1a; 词袋&#xff08;bow,bag of words&#xff09; one-hot 词向量 word2vec glove 目的&#xff1a;将一个词转换成一个向量 Word2vec 是一种用于生成词向量的工具包&#xff0c;由Google在2013年开源推出…...

老师如何在线发布期末考试成绩查询?

在这个数字化时代&#xff0c;教育领域也迎来了翻天覆地的变化。传统的纸质成绩查询方式已经逐渐被在线成绩查询所替代。如何高效、便捷地进行在线期末考试成绩查询&#xff1f; 成绩的录入与上传。教师需要将学生的考试成绩准确无误地录入系统。这一步骤需要细心和耐心&#x…...

TensorBoard相关学习

TensorBoard是Google为TensorFlow框架开发的一个强大的可视化工具&#xff0c;它可以帮助用户更直观地理解、分析和调试机器学习模型的训练过程。通过TensorBoard&#xff0c;你可以可视化模型的结构、监控训练过程中的指标变化&#xff08;如损失函数、准确率&#xff09;、查…...

敏感数据处理的艺术:安全高效的数据提取实践与挑战

在数字化时代&#xff0c;数据已成为驱动经济社会发展的核心要素之一。然而&#xff0c;伴随数据量的爆炸性增长&#xff0c;敏感数据的管理和保护成为了信息安全领域的重大挑战。敏感数据&#xff0c;包括个人身份信息、财务记录、健康档案、商业秘密等&#xff0c;一旦泄露&a…...

使用Python操作excel单元格——获取带公式单元格的值

一、前言 通过使用Python的openpyxl库&#xff0c;来操作excel单元格&#xff0c;获取带公式的单元格中的值。 把学习的过程分享给大家。大佬勿喷&#xff01; 二、程序展示 1、表格准备 使用前面创建过的表格&#xff0c;获取B6单元格的求和值。 2、获取表格的值 wb o…...

PHP开发入门

PHP官网&#xff1a;PHP: Hypertext Preprocessor apache官网&#xff1a;https://httpd.apache.org/ 一、搭建PHP环境 下载apache 进入官网点击download 选择下载windows版本文件 点击进入下载界面 点击下载64位版本文件 下载后解压文件 解压文件后进入 D:\httpd-2.4.59-24…...

HBase分布式数据库入门到精通

文章目录 HBase分布式数据库入门到精通 一、简单介绍 二、HBase数据模型 三、HBase的架构 四、HBase写操作流程 五、HBase读操作流程 六、HBase minor小合并和major大合并 七、HBase目标表meta表 八、HBase特点 九、HBase的使用场景 HBase分布式数据库入门到精通 一、…...

Java程序员必备技能之MySQL数据库 图解整理/快速入门

恭喜大家来到全新的篇章——MySQL数据库,这一篇我们将学会MySQL数据库的原理、使用sql对数据库的增删改查操作、以及对MySQL数据库的权限管理和用户管理等内容。请大家耐心看下去,相信大家在看完这篇文章后,一定可以学会MySQL数据库(不会Java也可以学会!)。 ps:想要补充…...

效果炸裂!使用 GPT-4o 快速实现LLM OS

使用 GPT-4o 快速实现LLM OS 什么是 LLM OS&#xff1f;LLM OS 主要有以下5个部分组成&#xff1a; LLM OS 开源实现运行 LLM OS 开源实现 什么是 LLM OS&#xff1f; 关于 LLM OS 的最初构想源自karpathy 在2023年11月11日发布的一条Twitter 动态&#xff0c;这是 LLM OS 概念…...

杀死那个进程

一、场景 eclipse在启动tomcat时&#xff0c;出现端口被占用的情况。我寻思着“任务管理器”没出现相应程序在跑啊。 1.1问题&#xff1a;端口和进程的关系 端口和进程之间存在着一种关系&#xff0c;端口是一个逻辑概念&#xff0c;它用于标识网络通信中的一个终点&#xff0…...

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…...

CVPR 2025 MIMO: 支持视觉指代和像素grounding 的医学视觉语言模型

CVPR 2025 | MIMO&#xff1a;支持视觉指代和像素对齐的医学视觉语言模型 论文信息 标题&#xff1a;MIMO: A medical vision language model with visual referring multimodal input and pixel grounding multimodal output作者&#xff1a;Yanyuan Chen, Dexuan Xu, Yu Hu…...

树莓派超全系列教程文档--(62)使用rpicam-app通过网络流式传输视频

使用rpicam-app通过网络流式传输视频 使用 rpicam-app 通过网络流式传输视频UDPTCPRTSPlibavGStreamerRTPlibcamerasrc GStreamer 元素 文章来源&#xff1a; http://raspberry.dns8844.cn/documentation 原文网址 使用 rpicam-app 通过网络流式传输视频 本节介绍来自 rpica…...

Linux相关概念和易错知识点(42)(TCP的连接管理、可靠性、面临复杂网络的处理)

目录 1.TCP的连接管理机制&#xff08;1&#xff09;三次握手①握手过程②对握手过程的理解 &#xff08;2&#xff09;四次挥手&#xff08;3&#xff09;握手和挥手的触发&#xff08;4&#xff09;状态切换①挥手过程中状态的切换②握手过程中状态的切换 2.TCP的可靠性&…...

【配置 YOLOX 用于按目录分类的图片数据集】

现在的图标点选越来越多&#xff0c;如何一步解决&#xff0c;采用 YOLOX 目标检测模式则可以轻松解决 要在 YOLOX 中使用按目录分类的图片数据集&#xff08;每个目录代表一个类别&#xff0c;目录下是该类别的所有图片&#xff09;&#xff0c;你需要进行以下配置步骤&#x…...

Axios请求超时重发机制

Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式&#xff1a; 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...

html-<abbr> 缩写或首字母缩略词

定义与作用 <abbr> 标签用于表示缩写或首字母缩略词&#xff0c;它可以帮助用户更好地理解缩写的含义&#xff0c;尤其是对于那些不熟悉该缩写的用户。 title 属性的内容提供了缩写的详细说明。当用户将鼠标悬停在缩写上时&#xff0c;会显示一个提示框。 示例&#x…...

C++课设:简易日历程序(支持传统节假日 + 二十四节气 + 个人纪念日管理)

名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 专栏介绍:《编程项目实战》 目录 一、为什么要开发一个日历程序?1. 深入理解时间算法2. 练习面向对象设计3. 学习数据结构应用二、核心算法深度解析…...

(一)单例模式

一、前言 单例模式属于六大创建型模式,即在软件设计过程中,主要关注创建对象的结果,并不关心创建对象的过程及细节。创建型设计模式将类对象的实例化过程进行抽象化接口设计,从而隐藏了类对象的实例是如何被创建的,封装了软件系统使用的具体对象类型。 六大创建型模式包括…...

TSN交换机正在重构工业网络,PROFINET和EtherCAT会被取代吗?

在工业自动化持续演进的今天&#xff0c;通信网络的角色正变得愈发关键。 2025年6月6日&#xff0c;为期三天的华南国际工业博览会在深圳国际会展中心&#xff08;宝安&#xff09;圆满落幕。作为国内工业通信领域的技术型企业&#xff0c;光路科技&#xff08;Fiberroad&…...