探索设计模式:观察者模式

探索设计模式:观察者模式

    • 🧐观察者模式简介
    • :gem:核心概念
    • :rainbow:观察者模式的优点
    • :truck:实现步骤
      • 1. 定义主题接口
      • 2. 实现观察者接口
      • 3. 具体主题实现
      • 4. 具体观察者实现
      • 5. 调用
    • :triangular_flag_on_post:总结

在这里插入图片描述

  在实际开发过程中,设计模式的作用是非常重要的,应用合适的设计模式不仅仅可以减少我们的代码量,也可以让我们的代码质量上升一个层次。今天让我们一起投袂而起,一起学习一下观察者模式(Observer Pattern)。

🧐观察者模式简介


  观察者模式是一种行为型 设计模式,它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。当主题对象状态发生变化时,会自动通知所有注册的观察者对象,从而它们能够自动更新自己。最常见的场景就是B站up主和粉丝的关系,up主发布新视频,每一个粉丝都会收到消息,这就是因为使用了观察者模式。

使用场景

  1. 消息发布/订阅系统
  2. 用户界面组件
  3. 股票市场监控
  4. 事件驱动系统

💎核心概念


  在观察者模式中,主要有两个核心角色:

  • 主题(Subject):也被称为被观察者,它维护一个观察者列表,当其状态发生变化时,会通知所有注册的观察者。
  • 观察者(Observer):监听主题对象状态变化,一旦主题状态发生变化,观察者会收到通知并做出相应的处理。

在这里插入图片描述

🌈观察者模式的优点


  • 低耦合性:主题和观察者之间的依赖关系被最小化,两者可以独立变化。
  • 动态性:可以在运行时动态地添加或删除观察者,使得系统更加灵活。
  • 响应性:观察者可以实时响应主题的变化,保证了系统的实时性和高效性。

🚚实现步骤


接下来,我们将通过以下步骤来实现一个简单的观察者模式:

1. 定义主题接口


  确定主题需要提供的方法,如注册观察者、移除观察者和通知观察者。

public interface Subject {void registerObserver(Observer observer);void removeObserver(Observer observer);void notifyObservers(String message);}

2. 实现观察者接口


  观察者需要定义一个更新接口,以便在主题状态变化时被调用。

public interface Observer {void update(String message);}

3. 具体主题实现


  实现主题接口,管理观察者列表,并在适当的时候通知观察者。

public class ConcreteSubject implements Subject {private List<Observer> observers = new ArrayList<>();@Overridepublic void registerObserver(Observer observer) {observers.add(observer);}@Overridepublic void removeObserver(Observer observer) {observers.remove(observer);}@Overridepublic void notifyObservers(String message) {for (Observer observer : observers) {observer.update(message);}}}

4. 具体观察者实现


  实现观察者接口,定义在自己的更新行为。

@Data
@AllArgsConstructor
@NoArgsConstructor
public class ConcreteObserver implements Observer {private String name;@Overridepublic void update(String message) {System.out.println(this.name + "收到了通知 : " + message);}}

5. 调用


public class ObserverPatternClient {public static void main(String[] args) {ConcreteSubject subject = new ConcreteSubject();Observer observer1 = new ConcreteObserver("张三");Observer observer2 = new ConcreteObserver("李四");subject.registerObserver(observer1);subject.registerObserver(observer2);subject.notifyObservers("Hello, world!");}
}

在这里插入图片描述

🚩总结


在这里插入图片描述

  观察者模式作为一种经典的设计模式,其核心在于解耦,它允许对象之间的松散耦合,使得它们可以独立地改变和复用。通过本文的深入剖析,我们了解到观察打折模式不仅能够提高系统的可维护性和可扩展性,还能够增强系统的响应性和灵活性。在实际开发过程中,当我么面临对象间一对多的关系,且一方对象的状态变化需要通知多方对象时,观察者模式便是一个理想的解决方案。

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

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

相关文章

【Hot100】LeetCode—124. 二叉树中的最大路径和

1- 思路 使用递归 dfs 实现① 递归思路&#xff1a;每次递归返回值为 &#xff0c; root.valMath.max(left,right) 从 左右孩子中挑选一个大的。② 递归公式&#xff1a;定义 sum&#xff0c;sum root.val left right 2- 实现 ⭐124. 二叉树中的最大路径和——题解思路 cl…

【矩阵对角线求和】求一个3*3矩阵对角线元素之和

求一个3*3矩阵对角线元素之和&#xff0c;使用C语言实现 具体代码&#xff1a; #include<stdio.h>int main(){float a[3][3],sum0;printf("请输入3x3矩阵的元素&#xff08;按行输入&#xff09;&#xff1a;\n");for(int i0;i<3;i){for(int j0;j<3;j)…

Java、PHP、Node 操作 MySQL 数据库常用方法

一、Java 操作 MySQL 数据库 1、Java 连接 MySQL 数据库 1. 使用 JDBC 驱动程序连接 使用这种方式&#xff0c;首先需要导入 MySQL 的 JDBC 驱动程序依赖&#xff0c;然后通过 Class.forName() 方法加载驱动程序类。其创建连接的过程相对直接&#xff0c;只需提供准确的数据库…

Tech Talk: SSD架构与功能模块详解

在之前的系列文章中&#xff0c;我们介绍了固态硬盘的系列知识&#xff0c;包括闪存的介质、原理&#xff0c;以及作为SSD大脑的控制器设计&#xff0c;本文将详细介绍SSD架构以及功能模块。 SSD架构简介 ◎SSD架构示意图 如上图所示&#xff0c;典型的SSD架构包括主机接口、SS…

点亮童梦思考之光,神秘伙伴震撼登场!

本文由 ChatMoney团队出品 介绍说明 咱们来聊聊“十万个为什么”机器人&#xff0c;这对小朋友来说&#xff0c;好处可多了去啦&#xff01; 小朋友们天生好奇&#xff0c;满脑子都是问号。 这个机器人就像个啥都懂的知识达人&#xff0c;不管他们问啥&#xff0c;都能给出答…

JVM知识总结(类加载器)

文章收录在网站&#xff1a;http://hardyfish.top/ 文章收录在网站&#xff1a;http://hardyfish.top/ 文章收录在网站&#xff1a;http://hardyfish.top/ 文章收录在网站&#xff1a;http://hardyfish.top/ 类加载器 Bootstrap引导类加载器 引导类加载器也被称为启动类加载…

麦田物语第二十天

系列文章目录 麦田物语第二十天 文章目录 系列文章目录一、构建地图信息系统二、生成地图数据 一、构建地图信息系统 我们上一节课已经做好了鼠标的显示&#xff0c;这节课需要构建地图的一些信息&#xff0c;例如&#xff1a;可挖坑&#xff0c;可丢弃物品等地区。我们点击地…

c语言学习,isdigit()函数分析

1&#xff1a;isdigit() 函数说明&#xff1a; 检查参数c&#xff0c;是否为0到9阿拉伯数字 2&#xff1a;函数原型&#xff1a; int isdigit(int c) 3&#xff1a;函数参数&#xff1a; 参数c&#xff0c;为检测整数 4&#xff1a;返回值&#xff1a; 参数c是阿拉伯码字符&…

【机器学习第8章——集成学习】

机器学习第8章——集成学习 8.集成学习8.1个体与集成弱分类器之间的关系组合时&#xff0c;如何选择学习器怎么组合弱分类器boosting和Bagging 8.2 BoostingAdaBoost算法步骤训练过程 8.3 Bagging与随机森林随机采样(bootstrap)弱学习器结合策略方差与偏差算法流程随机森林 8.4…

中职云计算实训室

一、实训室建设背景 随着信息技术的飞速发展&#xff0c;云计算已成为推动数字化转型、促进经济社会发展的重要力量。《中华人民共和国国民经济和社会发展第十四个五年规划和2035年远景目标纲要》明确提出&#xff0c;要加快数字化发展&#xff0c;建设数字中国。云计算作为数…

NLP——Transfromer 架构详解

Transformer总体架构图 输入部分&#xff1a;源文本嵌入层及其位置编码器、目标文本嵌入层及其位置编码器 编码器部分 由N个编码器层堆叠而成 每个编码器层由两个子层连接结构组成 第一个子层连接结构包括一个多头自注意力子层和规范化层以及一个残差连接 第二个子层连接结构包…

基于Java中的SSM框架实现远程同步课堂系统项目【项目源码+论文说明】计算机毕业设计

基于Java中的SSM框架实现远程同步课堂系统演示 远程同步课堂系统设计与实现 摘要&#xff1a;在这样一个网络数据大爆炸的时代&#xff0c;人们获取知识、获取信息的通道非常的多元化&#xff0c;通过网络来实现数据信息的获取成为了现在非常常见的一种方式&#xff0c;而通过…

MindSearch:用于增强网络搜索效率的开源人工智能

Web 信息查找与集成是搜索、检索、提取或集成 Web 资源以满足特定需求的活动&#xff0c;是实际生活中几乎所有领域中每个决策和解决问题的实体都必须执行的操作。 大型语言模型 (LLM) 与搜索引擎的集成重新定义了我们在网络上查找和使用信息的方式。因此&#xff0c;LLM 能够…

leetcode递归(203. 移除链表元素)

前言 经过前期的基础训练以及部分实战练习&#xff0c;粗略掌握了各种题型的解题思路。现阶段开始专项练习。 描述 给你一个链表的头节点 head 和一个整数 val &#xff0c;请你删除链表中所有满足 Node.val val 的节点&#xff0c;并返回 新的头节点 。 示例 1&#xff1a;…

将元组类型的日期时间转换为字符串格式time.asctime([t])

【小白从小学Python、C、Java】 【考研初试复试毕业设计】 【Python基础AI数据分析】 将元组类型的日期时间转换为 字符串格式 time.asctime([t]) [太阳]选择题 根据给定的Python代码&#xff0c;哪个选项是错误的&#xff1f; import time time_tuple (1993, 6, 30, 21, 49…

pytorch下载慢,如何下载到本地再去安装,本地安装pytorch

有时候按部就班的用指令去安装pytorch&#xff0c;网上很慢&#xff0c;并且往往最后可能还没有安装成功。 本次&#xff0c;介绍一下如何将这个文件先下载到本地&#xff0c;然后在去安装。 至于如何安装pytorch&#xff0c;先看一下我之前写的 深度学习环境-------pytorch…

什么是多模态大模型?为什么需要多模态大模型?

“ 多模态大模型&#xff0c;就是支持多种数据格式的模型**”** 很多人都听说过多模态&#xff0c;也知道多模态大模型&#xff0c;但如果让你介绍一下什么是多模态大模型&#xff0c;它有什么优点和缺点&#xff0c;以及为什么需要多模态&#xff0c;这时可能就有点傻眼了。‍…

jupyter项目使用Anaconda环境内核

1、创建虚拟环境 conda create --name myjupyter python3.7 2、进入虚拟环境 conda activate myjupyter 3、切换到自己jupyter notebook项目想在的目录 E: cd E:\first\project\jupyter\jupyter01 4、安装IPython内核包&#xff0c;这是Jupyter Notebook使用Python内核所必需的…

vlunstack-2(复现红日安全-ATT CK实战)

环境搭建 配置信息 DC IP&#xff1a;10.10.10.10 OS&#xff1a;Windows 2012(64) 应用&#xff1a;AD域 WEB IP1&#xff1a;10.10.10.80 IP2&#xff1a;192.168.47.131 OS&#xff1a;Windows 2008(64) 应用&#xff1a;Weblogic 10.3.6MSSQL 2008 PC IP1&#xff1a;10.10…

Chapter 30 多态

欢迎大家订阅【Python从入门到精通】专栏&#xff0c;一起探索Python的无限可能&#xff01; 文章目录 前言一、基本概念二、抽象类 前言 多态&#xff08;Polymorphism&#xff09;是面向对象编程中的核心概念&#xff0c;本章将详细讲解 Python 中多态的实现方式以及如何应用…