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

【观察者模式】 ——每天一点小知识

在这里插入图片描述

                                                                                       💧 观察者模式 \color{#FF1493}{观察者模式} 观察者模式💧          


🌷 仰望天空,妳我亦是行人.✨
🦄 个人主页——微风撞见云的博客🎐
🐳 《数据结构与算法》专栏的文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺
💧 《Java学习笔记》专栏的文章是本人在Java学习中总结的一些知识点~ 💐
🥣 《每天一点小知识》专栏的文章可以丰富你的知识库,滴水成河~ 🌊
🪁 希望本文能够给读者带来一定的帮助~🌸文章粗浅,敬请批评指正!🐥


文章目录

  • 🐳设计模式之观察者模式
    • 引言
    • 观察者模式的概念和思想
    • 应用场景
    • 实现方式
      • 使用接口
      • 使用 Java 内置的观察者模式
    • 使用观察者模式
    • 总结
  • 🐳结语


🐳设计模式之观察者模式

引言

设计模式是软件开发中重要的概念之一。观察者模式是设计模式中的一种,它用于定义对象之间的一对多依赖关系,当一个对象的状态发生改变时,其所有依赖者都会得到通知并自动更新。在本文中,我们将深入探讨观察者模式的概念和思想,并介绍观察者模式的应用场景以及常见的代码实现方式。


观察者模式的概念和思想

  💧观察者模式是一种行为型设计模式,它建立了一种对象之间的依赖关系,当一个对象的状态发生改变时,其所有依赖者都会得到通知并自动更新。

  💧观察者模式的核心思想是将观察者和被观察者解耦,使得它们可以独立变化。被观察者维护一个观察者列表,并提供注册、注销和通知观察者的方法。观察者通过注册到被观察者上,实现对被观察者状态变化的监听。

观察者模式的应用场景以及常见的代码实现方式 ↓

应用场景

  💧观察者模式通常在以下场景中使用:

  • 当一个对象的状态变化需要通知其他对象,并且不希望与被通知的对象之间产生紧耦合关系时。
  • 当一个对象的改变需要同时改变其他对象,并且不知道有多少对象需要改变时。
  • 当一个对象需要将自己的改变通知给一组对象

实现方式

  💧观察者模式有多种实现方式,其中最常见的方式包括使用接口使用 Java 内置的观察者模式实现。

使用接口

  💧首先,我们定义一个被观察者接口 Subject 和一个观察者接口 Observer

public interface Subject {void registerObserver(Observer observer);void unregisterObserver(Observer observer);void notifyObservers();
}public interface Observer {void update();
}

在上述代码中,Subject 接口定义了注册观察者、注销观察者和通知观察者的方法。Observer 接口定义了观察者的 update() 方法,用于接收被观察者的通知。

  💧接下来,我们实现具体的被观察者类 ConcreteSubjectConcreteObserver

public class ConcreteSubject implements Subject {private List<Observer> observers = new ArrayList<>();private int state;public void registerObserver(Observer observer) {observers.add(observer);}public void unregisterObserver(Observer observer) {observers.remove(observer);}public void notifyObservers() {for (Observer observer : observers) {observer.update();}}public int getState() {return state;}public void setState(int state) {this.state = state;notifyObservers();}
}public class ConcreteObserver implements Observer {private Subject subject;public ConcreteObserver(Subject subject) {this.subject = subject;subject.registerObserver(this);}public void update() {int state = subject.getState();// 处理被观察者状态变化的逻辑}
}

在上述代码中,ConcreteSubject 类实现了 Subject 接口,它维护了一个观察者列表并实现了注册、注销和通知观察者的方法。当 ConcreteSubject 的状态发生变化时,它会调用 notifyObservers() 方法通知所有观察者。

ConcreteObserver 类实现了 Observer 接口,它在构造函数中注册到被观察者上,并实现了 update() 方法来处理被观察者状态变化的逻辑。

使用 Java 内置的观察者模式

  💧Java 提供了内置的观察者模式实现,可以通过 java.util.Observable 类和 java.util.Observer 接口来实现观察者模式。

import java.util.Observable;
import java.util.Observer;public class ConcreteSubject extends Observable {private int state;public int getState() {return state;}public void setState(int state) {this.state = state;setChanged();notifyObservers();}
}public class ConcreteObserver implements Observer {public void update(Observable o, Object arg) {int state = ((ConcreteSubject) o).getState();// 处理被观察者状态变化的逻辑}
}

在上述代码中,ConcreteSubject 类继承自 java.util.Observable 类,并使用 setChanged() 方法标记状态变化,然后调用 notifyObservers() 方法通知观察者。

ConcreteObserver 类实现了 java.util.Observer 接口,它的 update() 方法会在被观察者状态变化时被调用。

使用观察者模式

  💧以下是观察者模式的使用示例:

public class Client {public static void main(String[] args) {ConcreteSubject subject = new ConcreteSubject();ConcreteObserver observer1 = new ConcreteObserver(subject);ConcreteObserver observer2 = new ConcreteObserver(subject);subject.setState(1);// 输出:处理被观察者状态变化的逻辑// 输出:处理被观察者状态变化的逻辑}
}

在上述代码中,我们创建了一个具体的被观察者对象 ConcreteSubject 和两个具体的观察者对象 ConcreteObserver。通过将观察者注册到被观察者上,当被观察者状态发生变化时,观察者的 update() 方法会被调用。

总结

    观察者模式是一种有用的设计模式,它能够实现对象之间的一对多依赖关系,当一个对象的状态发生改变时,其所有依赖者都会得到通知并自动更新。通过观察者模式,我们可以实现松耦合的对象间通信,提高代码的灵活性和可维护性。


在这里插入图片描述


🐳结语

🐬初学一门技术时,总有些许的疑惑,别怕,它们是我们学习路上的点点繁星,帮助我们不断成长。

🐟积少成多,滴水成河。文章粗浅,希望对大家有帮助!

相关文章:

【观察者模式】 ——每天一点小知识

&#x1f4a7; 观察者模式 \color{#FF1493}{观察者模式} 观察者模式&#x1f4a7; &#x1f337; 仰望天空&#xff0c;妳我亦是行人.✨ &#x1f984; 个人主页——微风撞见云的博客&#x1f390; &#x1f433; 《数据结构与算法》专栏的文章图文并茂&#x1f995;…...

el-ment ui 表格组件table实现列的动态插入功能

在实际需求中我们经常遇到各种奇葩的需求&#xff0c;不足为奇。每个项目的需求各不相同&#xff0c;实现功能的思路大致是一样的。 本文来具体介绍怎么实现table表格动态插入几列。 首先实现思路有2种&#xff0c; 1. 插入的位置如果是已知的&#xff0c;我知道在哪个标题的…...

gitLab修改密码后,sourceTree如何修改密码

修改gitLab密码后&#xff0c;在sourceTree提交或者更新代码会报&#xff1a;fatal: Authentication failed for~ 简单粗暴的方法&#xff1a; 到C:\Users\用户\AppData\Local\Atlassian\SourceTree&#xff0c;找到passwd文件&#xff0c;并删除&#xff1b; 重启sourceTre…...

sop是什么意思

标准作业程序 执行复杂的日常事务所设计的内部程序 内容 所谓SOP&#xff0c;是 Standard Operating Procedure三个单词中首字母的大写 &#xff0c;即标准作业程序&#xff0c;指将某一事件的标准操作步骤和要求以统一的格式描述出来&#xff0c;用于指导和规范日常的工作。…...

【C#】Kestrel和IIS服务器下的同步与异步配置

最近在回看自己写的代码时&#xff0c;发现服务配置里最开头写了两段代码&#xff0c;第一感觉&#xff0c;这是啥功能&#xff0c;太久有点生疏了&#xff0c;经过一顿搜索和回顾&#xff0c;简单整理如下 目录 1、Kestrel服务器1.1、跨平台1.2、高性能1.3、可扩展性1.4、安全…...

GoLand导入redis的github包失败

GoLand导入redis依赖失败 网上有下载guryburd和gomodel的&#xff0c;这里按照官网文档安装依赖 以下命令在项目的根目录执行 初始化一个Go模块&#xff1a; go mod init github.com/my/repoTo install go-redis/v9:要安装go-redis/v9&#xff1a; go get github.com/redis/…...

Elasticsearch原理剖析

一、 Elasticsearch结构 Elasticsearch集群方案由EsMaster、EsClient和EsNode1、EsNode2、EsNode3、EsNode4、EsNode5、EsNode6、EsNode7、EsNode8、EsNode9进程组成&#xff0c;如下图所示&#xff0c;模块说明如表下所示。 说明如表&#xff1a; 名称说明ClientClient使用H…...

数据在内存中的存储1(C语言进阶)

数据在内存中的存储 1.数据类型介绍1.1类型的基本归类&#xff1a;整形家族浮点数家族构造类型指针类型空类型 2.整形在内存中的存储2.1 原码、反码、补码2.2 大小端介绍为什么有大端和小端&#xff1a; 我们今天来学习数据在内存中的存储 1.数据类型介绍 前面我们已经学习了基…...

Kubernetes API Server 中启用 pprof 接口

要在 Kubernetes API Server 中启用 pprof 接口&#xff0c;你需要在 API Server 的启动参数或配置文件中进行相应的配置。以下是一些常见的方法&#xff1a; 通过启动参数启用 pprof 接口&#xff1a;在运行 API Server 的命令中&#xff0c;添加 -runtime-configapi/alltrue …...

Docker 私有仓库 harbor 搭建

&#x1f388; 作者&#xff1a;Linux猿 &#x1f388; 简介&#xff1a;CSDN博客专家&#x1f3c6;&#xff0c;华为云享专家&#x1f3c6;&#xff0c;Linux、C/C、云计算、物联网、面试、刷题、算法尽管咨询我&#xff0c;关注我&#xff0c;有问题私聊&#xff01; &…...

工厂方法模式

在开发组件的时候比如button、text等&#xff0c;需要对这些组件做比较多的初始化工作&#xff0c;比如初始化长度等。传统的开发方案如下&#xff1a; 图 传统开发方案UML 上面的方案组件创建及组件的其他业务操作耦合在一起&#xff0c;违背了单一职责原则&#xff1b;在客户…...

(CentOS 7)nvidia-smi:Failed to initialize NVML: Driver/library version mismatch

[CentOS 7]nvidia-smi:Failed to initialize NVML: Driver/library version mismatch 问题源头&#xff1a; nvidia-smi \text{nvidia-smi} nvidia-smi报错问题 CUDA \text{CUDA} CUDA安装时的问题 这里仅描述自身发现的一种情况&#xff0c;希望对大家有所帮助。 问题源头&…...

呼吸灯——FPGA

文章目录 前言一、呼吸灯是什么&#xff1f;1、介绍2、占空比调节示意图 二、系统设计1、系统框图2、RTL视图 三、源码四、效果五、总结六、参考资料 前言 环境&#xff1a; 1、Quartus18.0 2、vscode 3、板子型号&#xff1a;EP4CE6F17C8 要求&#xff1a; 将四个LED灯实现循环…...

群辉用户接入vocechat的方法(附开通GPT机器人)

群辉安装聊天服务器-加入chatgpt vocechat项目简单的使用介绍集成群辉帐号系统登陆vocechat 第二章接入chatgpt这是一个机器人的演示 这是个处于发展中的不错的项目吧&#xff0c;才感觉到好神奇。有意思。 vocechat项目简单的使用介绍 昨天的找群辉文章的时候看到了vocechat&…...

flutter js交互传参

加载网页的webView WebView(initialUrl:http://test/h5atui//#/mobileMaps?lng${CommonConfig.lng}&lat${CommonConfig.lat},javascriptMode: JavascriptMode.unrestricted,onWebViewCreated: (controller) {_webViewController controller;},onProgress: (process){set…...

重磅IntelliJ IDEA 2023.2 新版本即将发布,拥抱 AI

IntelliJ IDEA 近期连续发布多个EAP版本&#xff0c;官方在对用户体验不断优化的同时&#xff0c;也新增了一些不错的功能&#xff0c;尤其是人工智能助手补充&#xff0c;AI Assistant&#xff0c;相信在后续IDEA使用中&#xff0c;会对开发者工作效率带来不错的提升。 以下是…...

JavaWeb_SpringCloud微服务_Day1-eureka, ribbon, nacos

JavaWeb_SpringCloud微服务_Day1-eureka, ribbon, nacos 认识微服务微服务技术对比 分布式服务架构案例远程调用 eureka注册中心原理搭建EurekaServer服务注册服务发现 Ribbon负载均衡修改负载均衡饥饿加载 nacos注册中心快速入门eureka和nacos对比 来源 认识微服务 微服务技术…...

数据科学领域常用python库

pandas Pandas 的名称源自 “ panel data ”&#xff0c;这是一个计量经济学术语&#xff0c;用于表示多维结构化数据集和 “ Python 数据分析”。众所周知&#xff0c;清理和转换数据在数据分析中非常重要&#xff0c;Pandas 提供了丰富的数据结构和功能&#xff0c;使数据处…...

【Android关键字】startActivityForResult/onActivityResult/setResult方法的使用

最近在写一个安卓程序&#xff0c;在程序里需要用到startActivityForResult这个Intent操作关键字&#xff0c;与该关键字有关的还有onActivityResult和setResult。这里对其用法进行一个总结。 三者在API中的形式 //startActivityForResult与startActivity类似&#xff0c;只不…...

PyTorch深度学习实战(5)——计算机视觉

PyTorch深度学习实战&#xff08;5&#xff09;——计算机视觉 0. 前言1. 图像表示2. 将图像转换为结构化数组2.1 灰度图像表示2.2 彩色图像表示 3 利用神经网络进行图像分析的优势小结系列链接 0. 前言 计算机视觉是指通过计算机系统对图像和视频进行处理和分析&#xff0c;利…...

大数据学习栈记——Neo4j的安装与使用

本文介绍图数据库Neofj的安装与使用&#xff0c;操作系统&#xff1a;Ubuntu24.04&#xff0c;Neofj版本&#xff1a;2025.04.0。 Apt安装 Neofj可以进行官网安装&#xff1a;Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...

云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地

借阿里云中企出海大会的东风&#xff0c;以**「云启出海&#xff0c;智联未来&#xff5c;打造安全可靠的出海云网络引擎」为主题的阿里云企业出海客户沙龙云网络&安全专场于5.28日下午在上海顺利举办&#xff0c;现场吸引了来自携程、小红书、米哈游、哔哩哔哩、波克城市、…...

java 实现excel文件转pdf | 无水印 | 无限制

文章目录 目录 文章目录 前言 1.项目远程仓库配置 2.pom文件引入相关依赖 3.代码破解 二、Excel转PDF 1.代码实现 2.Aspose.License.xml 授权文件 总结 前言 java处理excel转pdf一直没找到什么好用的免费jar包工具,自己手写的难度,恐怕高级程序员花费一年的事件,也…...

苍穹外卖--缓存菜品

1.问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得&#xff0c;如果用户端访问量比较大&#xff0c;数据库访问压力随之增大 2.实现思路 通过Redis来缓存菜品数据&#xff0c;减少数据库查询操作。 缓存逻辑分析&#xff1a; ①每个分类下的菜品保持一份缓存数据…...

网络编程(UDP编程)

思维导图 UDP基础编程&#xff08;单播&#xff09; 1.流程图 服务器&#xff1a;短信的接收方 创建套接字 (socket)-----------------------------------------》有手机指定网络信息-----------------------------------------------》有号码绑定套接字 (bind)--------------…...

.Net Framework 4/C# 关键字(非常用,持续更新...)

一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...

【电力电子】基于STM32F103C8T6单片机双极性SPWM逆变(硬件篇)

本项目是基于 STM32F103C8T6 微控制器的 SPWM(正弦脉宽调制)电源模块,能够生成可调频率和幅值的正弦波交流电源输出。该项目适用于逆变器、UPS电源、变频器等应用场景。 供电电源 输入电压采集 上图为本设计的电源电路,图中 D1 为二极管, 其目的是防止正负极电源反接, …...

【Linux】自动化构建-Make/Makefile

前言 上文我们讲到了Linux中的编译器gcc/g 【Linux】编译器gcc/g及其库的详细介绍-CSDN博客 本来我们将一个对于编译来说很重要的工具&#xff1a;make/makfile 1.背景 在一个工程中源文件不计其数&#xff0c;其按类型、功能、模块分别放在若干个目录中&#xff0c;mak…...

​​企业大模型服务合规指南:深度解析备案与登记制度​​

伴随AI技术的爆炸式发展&#xff0c;尤其是大模型&#xff08;LLM&#xff09;在各行各业的深度应用和整合&#xff0c;企业利用AI技术提升效率、创新服务的步伐不断加快。无论是像DeepSeek这样的前沿技术提供者&#xff0c;还是积极拥抱AI转型的传统企业&#xff0c;在面向公众…...

向量几何的二元性:叉乘模长与内积投影的深层联系

在数学与物理的空间世界中&#xff0c;向量运算构成了理解几何结构的基石。叉乘&#xff08;外积&#xff09;与点积&#xff08;内积&#xff09;作为向量代数的两大支柱&#xff0c;表面上呈现出截然不同的几何意义与代数形式&#xff0c;却在深层次上揭示了向量间相互作用的…...