观察者模式和发布-订阅模式有什么异同?它们在哪些情况下会被使用?
大家好,我是锋哥。今天分享关于【观察者模式和发布-订阅模式有什么异同?它们在哪些情况下会被使用?】面试题。希望对大家有帮助;
观察者模式和发布-订阅模式有什么异同?它们在哪些情况下会被使用?
1000道 互联网大厂Java工程师 精选面试题-Java资源分享网
观察者模式 (Observer Pattern) 和 发布-订阅模式 (Publish-Subscribe Pattern) 都是常见的设计模式,主要用于实现事件驱动的通信机制,通常用于解耦组件之间的依赖关系,促进松耦合的架构设计。虽然这两种模式有一些相似之处,但它们在结构、实现方式以及适用场景上有一些关键的区别。
1. 观察者模式 (Observer Pattern)
定义:
观察者模式是一种行为型设计模式,它定义了一种一对多的依赖关系,当一个对象(主题,Subject)的状态发生变化时,所有依赖于它的对象(观察者,Observer)都会被自动通知并更新。这种模式常用于实现事件驱动的系统,在某个对象的状态发生改变时,其他对象需要响应这些变化。
结构:
- Subject (主题):被观察的对象,维护着所有依赖它的观察者。
- Observer (观察者):依赖于
Subject
的对象,当Subject
发生变化时,观察者会得到通知并做出相应更新。 - ConcreteSubject (具体主题):具体的被观察者,它会通知所有的观察者。
- ConcreteObserver (具体观察者):具体的观察者,它会对
Subject
的状态变化做出响应。
优点:
- 松耦合:
Subject
和Observer
之间没有强依赖关系,Subject
只需知道Observer
的接口,而不关心具体的实现。 - 可扩展性强:新的观察者可以方便地加入系统中,不需要改变现有的代码。
缺点:
- 可能产生过多的更新:如果
Subject
状态变化频繁,可能会导致大量的通知,影响性能。 - 观察者不当管理:如果观察者没有正确地管理其生命周期(比如注销不再需要的观察者),可能会导致内存泄漏。
使用场景:
- GUI框架中的事件监听,比如按钮点击、窗口状态变化。
- MVC框架中的数据模型和视图的更新。
- 发布状态变化时通知多个不同的处理器。
2. 发布-订阅模式 (Publish-Subscribe Pattern)
定义:
发布-订阅模式是一种消息传递模式,它允许一个组件(发布者)将消息发布到一个消息系统(消息代理),然后其他订阅者可以订阅这些消息并接收通知。它的核心思想是“发布”和“订阅”是解耦的,发布者不知道有多少订阅者,订阅者也不关心消息的来源。
结构:
- Publisher (发布者):消息的发布者,负责发布消息。
- Subscriber (订阅者):消息的订阅者,接收感兴趣的消息。
- Message Broker (消息中介):中介系统,负责将发布的消息分发给所有订阅者。发布者与订阅者之间通过这个消息中介进行间接通信。
优点:
- 松耦合:发布者和订阅者之间没有直接的依赖关系,发布者不知道有多少个订阅者,也不关心它们的具体实现。
- 灵活性高:订阅者可以根据需要选择订阅特定的消息类型,并且可以随时添加或删除订阅者。
- 异步处理:消息可以异步传递,不会直接影响发布者的执行流。
缺点:
- 消息中介的复杂性:引入了消息中介,可能增加系统的复杂性和维护成本。
- 潜在的消息丢失问题:如果没有可靠的消息传递机制,可能会出现消息丢失或延迟的问题。
- 消息顺序问题:订阅者收到消息的顺序可能无法保证,尤其在分布式系统中。
使用场景:
- 事件驱动系统,如推送通知、消息队列(例如Kafka、RabbitMQ)。
- 微服务架构中的异步通信。
- 游戏开发中的玩家事件通知、多人实时互动。
- 实时数据流和日志系统。
3. 异同点
特性 | 观察者模式 (Observer) | 发布-订阅模式 (Publish-Subscribe) |
---|---|---|
耦合程度 | 松耦合,但Subject 知道所有的Observer | 松耦合,Publisher 与Subscriber 之间没有直接关系 |
依赖关系 | Subject 和Observer 之间直接依赖 | Publisher 和Subscriber 之间通过消息中介解耦 |
消息传递方式 | 直接通知观察者,通常是同步的 | 通过消息代理中介,通常是异步的 |
消息过滤 | 观察者自己决定是否响应Subject 的变化 | 订阅者订阅特定类型的消息,可以精确过滤消息内容 |
使用场景 | 用于小范围的事件通知,适用于单一主题和观察者的场景 | 用于多主题和多订阅者的场景,适用于消息传递和异步处理 |
复杂度 | 较简单,通常应用于较小规模的应用程序或组件 | 更复杂,常用于分布式系统、大规模的消息传递系统 |
4. 选择使用观察者模式或发布-订阅模式的考虑
-
观察者模式:如果你的系统中只有一个“主题”对象需要通知多个“观察者”对象,并且这些观察者需要对该主题的状态变化做出响应,观察者模式通常更简单直接。比如在GUI系统中,一个按钮被点击后,需要通知多个不同的监听器,使用观察者模式即可。
-
发布-订阅模式:如果你的系统中有多个消息来源和多个独立的订阅者,或者需要通过中介(如消息队列)实现异步消息传递,并且需要处理不同类型的事件或消息,发布-订阅模式会更加灵活和适用。比如在分布式系统中,各个微服务之间通过消息队列进行通信和数据同步时,通常使用发布-订阅模式。
总结:
- 观察者模式 更侧重于一个对象的状态变化需要通知多个依赖对象的场景,适合用在较为简单的事件通知机制中。
- 发布-订阅模式 更适合复杂的消息传递系统,特别是需要支持多个发布者和订阅者之间异步通信时,具有更高的扩展性和灵活性。
相关文章:
观察者模式和发布-订阅模式有什么异同?它们在哪些情况下会被使用?
大家好,我是锋哥。今天分享关于【观察者模式和发布-订阅模式有什么异同?它们在哪些情况下会被使用?】面试题。希望对大家有帮助; 观察者模式和发布-订阅模式有什么异同?它们在哪些情况下会被使用? 1000道 …...
如何保证mysql数据库到ES的数据一致性
1.同步双写方案 在代码中对数据库和ES进行双写操作,确保先更新数据后更新ES。 优点: 数据一致性:双写策略可以保证在MySql和Elasticsearch之间数据的强一致性,因为每次数据库的变更都会在Elasticsearch同步反映。实时性…...
RabbitMQ 的7种工作模式
RabbitMQ 共提供了7种⼯作模式,进⾏消息传递,. 官⽅⽂档:RabbitMQ Tutorials | RabbitMQ 1.Simple(简单模式) P:⽣产者,也就是要发送消息的程序 C:消费者,消息的接收者 Queue:消息队列,图中⻩⾊背景部分.类似⼀个邮箱,可以缓存消息;⽣产者向其中投递消息,消费者从其中取出消息…...
红黑树 Red-Black Tree介绍
1. 红黑树的定义 红黑树是一种具有如下性质的二叉搜索树: 每个节点是红色或黑色。根节点是黑色。所有叶子节点都是黑色的空节点(NIL节点),即哨兵节点。如果一个节点是红色,那么它的子节点一定是黑色。(不存…...
我的创作纪念日—致敬未来的自己
机缘 为什么想去写文章呢? 1、想把自己学的知识和技能做一个总结。 2、想给多年后的自己留下一些财富。 3、希望自己分享的知识和经验也能帮到其他有需要的人 收获 在创作的过程中都有哪些收获? 1、每次对知识的总结,都让我的技能更加的…...
Android Studio IDE环境配置
需要安装哪些东西: Java jdk Java Downloads | OracleAndroid Studio 下载 Android Studio 和应用工具 - Android 开发者 | Android DevelopersAndroid Sdk 现在的Android Studio版本安装时会自动安装,需要注意下安装的路径Android Studio插件…...
matlab中的cell
在MATLAB中,cell 是一种非常重要的数据类型,它能够存储不同类型和大小的数据,这使得它非常灵活,适用于处理复杂的数据结构。 1. 基本介绍 cell 类型的变量可以存储不同类型的数据,如数值、字符、结构体、甚至其他的 …...
Vue项目中env文件的作用和配置
在实际项目的开发中,我们一般会经历项目的开发阶段、测试阶段和最终上线阶段,每一个阶段对于项目代码的要求可能都不尽相同,那么我们如何能够游刃有余的在不同阶段下使我们的项目呈现不同的效果,使用不同的功能呢?这里…...
基于致远OA+慧集通平台的企业主数据管理设计方案(一)
目标 1、实现集团组织主数据的集中统一管理,包括到主数据在致远中的审批新增、编辑、分发等操作; 2、实现集团用户系统权限的集中管理,统一在致远平台中为用户配置各系统中的权限,配置完成后,可以自动或手动的分发到…...
vue前端实现同步发送请求,可设置并发数量【已封装】
新建 TaskManager.js export default class TaskManager {constructor(maxConcurrentTasks 1) {// 最大并发任务数// to do// 并发任务数大于1 接口开始有概率返回空值,推测是后端问题this.maxConcurrentTasks maxConcurrentTasks;this.currentTasks 0;this.tas…...
vue3使用vant日历组件(calendar),自定义日历下标的两种方法
在vue3中使用vant日历组件(calendar)自定义下标的两种方法,推荐使用第二种: 日期下方加小圆点: 一、使用伪元素样式实现(::after伪元素小圆点样式会被覆盖,只能添加一个小圆点) 代码如下(示例…...
Java线程池面试题
为什么要用线程池 降低资源消耗:通过重复利用已创建的线程降低线程创建和销毁造成的消耗提高响应速度:当任务到达时,任务可以不需要等到线程创建就能立即执行方便管理线程:线程是稀缺资源,如果无条件地创建࿰…...
我的 2024 年终总结
2024 年,我离开了待了两年的互联网公司,来到了一家聚焦教育机器人和激光切割机的公司,没错,是一家硬件公司,从未接触过的领域,但这还不是我今年最重要的里程碑事件 5 月份的时候,正式提出了离职…...
Mysql8 数据库安装及主从配置
一、MySQL8 安装 下载 MySQL 8 的安装包并将其上传到服务器。将安装包解压到指定的目录,例如 /opt/mysql8。创建一个名为 mysql 的用户组和一个名为 mysql 的用户,并将用户添加到组中。同时,设置用户密码并更改用户的主目录和默认 shell。配…...
Unity中UGUI的Button动态绑定引用问题
Unity中UGUI的Button动态绑定引用问题 问题代码修改代码如下总结 问题代码 Button动态绑定几个连续的按钮事件时使用for循环的i做按钮的id发现按钮点击对应不上。如下代码 for (int i 0; i < 10; i) {btn[i].onClick.AddListener(() >{Click(i);}); }/// <summary&…...
测试基础之测试分类
软件测试是确保软件产品满足预期功能、性能和用户体验要求的关键环节。它的主要目的是通过系统化的方法发现并修复软件中的缺陷,从而提高软件的质量和可靠性。在软件开发生命周期的不同阶段执行测试,以尽早发现潜在的错误或类型,早期发现缺陷…...
VS2022 中的 /MT /MTd /MD /MDd 选项
我们有时编译时,需要配置这个 运行库,指定C/C++运行时库的链接方式。 如下图 那么这些选项的含义是什么? /MT:静态链接多线程库 /MT选项代表“Multi-threaded Static”,即多线程静态库。选择此选项时,编译器会从运行时库中选择多线程静态连接库来解释程序中的代码,…...
socket.io
import { ref } from "vue" import io from "socket.io-client" import { getToken } from "./auth" const socket ref(null) const serverUri import.meta.env.VITE_APP_API_URL// 你的服务器地址 // const serverUri "http://172.16.3…...
latex常见问题汇总
文章目录 单行多图显示双栏插入图片 单行多图显示 \begin{figure}[t!] % case 1\centering\setlength{\tabcolsep}{0.5pt} % 图片之间的距离为0.5 point\begin{tabular}{ccc}\includegraphics[width0.30\linewidth, height0.33\linewidth]{pic/xuLun/thin.png} &\includeg…...
从数据到决策:如何利用多维度交叉分析提升企业整体效能
随着“GenAI”技术的崛起,数据分析在各行各业的应用也发生了深远的变化。IDC中国的调研数据显示,68%的企业在落地GenAI应用时认为,梳理和整合内部数据资产是首要任务;66%的企业则表示,搭建数据湖等数据底座是推动智能化…...
Nmap基础入门及常用命令汇总
Nmap基础入门 免责声明:本文单纯分享技术,请大家使用过程中遵守法律法规~ 介绍及安装 nmap是网络扫描和主机检测的工具。作为一个渗透测试人员,必不可少的就是获取信息。那么nmap就是我们从互联网上获取信息的途径,我们可以扫描互…...
【gopher的java学习笔记】spring web接口404了怎么办
今天新搭了一个spring boot带spring web的工程,不得不说,这java的生态是比golang要齐全一点,各种脚手架工程应有尽有。 因为我们的目标是有个web service,所以spring boot的工程搭好之后,就寻思着给这个spring应用添加…...
constexpr 的概念及用途
constexpr 的概念及用途 constexpr 是 C11 引入的关键字,用于定义常量表达式。常量表达式是指在编译时能够求值的表达式,也就是说,constexpr 用来标识那些编译器在编译时就可以计算结果的变量、函数或对象。 constexpr 在 C 中非常重要&…...
开放世界目标检测 Grounding DINO
开放世界目标检测 Grounding DINO flyfish Grounding DINO 是一种开创性的开放集对象检测器,它通过结合基于Transformer的检测器DINO与基于文本描述的预训练技术,实现了可以根据人类输入(如类别名称或指代表达)检测任意对象的功…...
【Spring】基于XML的Spring容器配置—— <import>标签的使用
Spring容器是Spring框架的核心部分,负责管理应用程序中的对象及其生命周期。Spring容器的配置方式有多种,其中基于XML的配置方式仍然被广泛使用,尤其是在一些老旧项目中。本文将详细介绍Spring容器配置中的<import>标签的使用ÿ…...
GemPy 3 地质建模快速入门指南
GemPy 3简介 GemPy 3是一款基于Python的开源三维结构地质建模软件。 GemPy 3由德国的Terranigma Solutions公司维护,并在GitHub上进行开源开发。它允许用户从界面和方向数据中自动创建复杂的地质模型,并支持随机建模以解决参数和模型不确定性问题。新版…...
智慧农业物联网传感器:开启农业新时代
在当今科技飞速发展的时代,农业领域正经历着一场前所未有的变革,而智慧农业物联网传感器无疑是这场变革中的关键利器。它宛如农业的 “智慧大脑”,悄然渗透到农业生产的各个环节,为传统农业注入了全新的活力,让农业生产…...
Spring Boot应用开发实战:从入门到精通
一、Spring Boot 简介 1.1 什么是 Spring Boot? Spring Boot 是一个开源框架,旨在简化新 Spring 应用的初始搭建以及开发过程。它构建在 Spring 框架之上,利用了 Spring 的核心特性,如依赖注入(Dependency Injection&…...
salesforce Controlled by Parent 的对象如何实现部分情况 Parent可见,但是 该对象不可见
在 Salesforce 中,设置对象的访问控制为“Controlled by Parent”时,该对象的可见性通常由其主对象(Parent)的共享规则或权限决定。如果主对象可见,子对象也会自动继承可见性。然而,有时候我们希望实现一些…...
React 第二十节 useRef 用途使用技巧注意事项详解
简述 useRef 用于操作不需要在视图上渲染的属性数据,用于访问真实的DOM节点,或者React组件的实例对象,允许直接操作DOM元素或者是组件; 写法 const inpRef useRef(params)参数: useRef(params),接收的 …...
TCP/IP 邮件
TCP/IP邮件是互联网通信中非常重要的应用之一。当我们发送电子邮件时,我们实际上并没有直接使用TCP/IP协议,而是通过电子邮件程序,例如微软的Outlook、莲花软件的Notes或Netscape Communicator等来实现。这些电子邮件程序背后使用了不同的TCP…...
前缀和与差分
目录 前缀和 一维前缀和 二维前缀和 差分 一维差分 二维差分 进阶练习NOIP普及组与提高组 前缀和 前缀和是一种思想,代码短小精悍是它的特点。相比于数据较大时的从头至尾遍历和优化过的双指针方法来求区间和,前缀和在对于数据进行处理的速度上有…...
2024国赛A问题5
问题五 龙头最大速度优化模型的建立 问题五在问题四的曲线的基础上对速度进行了约束,即在逐步改变龙头速度的情况下,各个龙身的速度也会依次改变,给出龙头的最大行进速度,使得舞龙队各把手的速度均不超过 2 m/s。即可依此构建一个龙头速度的…...
香橙派5Plus启动报错bug: spinlock bad magic on cpu#6, systemd-udevd/443
一、问题 如图: 接上调试串口,每次启动都会报错。不过使用过程中没有发现有什么影响。 百度查阅,有一位博主提到,但是没有细说解决方案: spinlock变量没有初始化_spinlock bad magic on-CSDN博客https://blog.csdn.n…...
MySQL 常用程序介绍
以下是一些常用的MySQL程序: 程序名作⽤mysqldMySQL的守护进程即 MySQL 服务器,要使⽤MySQL 服务器 mysqld必须正在运⾏状态mysql MySQL客⼾端程序,⽤于交互式输⼊ SQL 语句或以批处理模式从⽂件执⾏SQL的命令⾏⼯具 mysqlcheck⽤于检查、修…...
DevOps实战:用Kubernetes和Argo打造自动化CI/CD流程(1)
DevOps实战:用Kubernetes和Argo打造自动化CI/CD流程(1) 架构 架构图 本设计方案的目标是在一台阿里云ECS服务器上搭建一个轻量级的Kubernetes服务k3s节点,并基于Argo搭建一套完整的DevOps CI/CD服务平台,包括Argo CD…...
RBAC模型
RBAC模型 1.概念 RBAC:role based access control,基于角色的权限控制 三个主体 - 用户 - 角色 - 权限 授权的本质是对用户授权角色,假设系统的用户数量特别多的话可以对用户设置用户组。 2.RBAC表基本设计 用户表 角色表 权限表 …...
CultureLLM 与 CulturePark:增强大语言模型对多元文化的理解
本文介绍团队刚刚在加拿大温哥华召开的顶会NeurIPS 2024上发表的两篇系列工作:CultureLLM 和CulturePark。此项研究以生成文化数据并训练文化专有模型为主要手段,旨在提升已有基础模型的多文化理解能力,使得其在认知、偏见、价值观、在线教育…...
sentinel学习笔记6-限流降级(上)
本文属于sentinel学习笔记系列。网上看到吴就业老师的专栏,写的好值得推荐,我整理的有所删减,推荐看原文。 https://blog.csdn.net/baidu_28523317/category_10400605.html sentinel 实现限流降级、熔断降级、黑白名单限流降级、系统自适应…...
redis cluster集群
华子目录 什么是redis集群redis cluster的体系架构什么是数据sharding?什么是hash tag集群中删除或新增节点,数据如何迁移?redis集群如何使用gossip通信?定义meet信息ping消息pong消息fail消息(不是用gossip协议实现的࿰…...
设计模式从入门到精通之(二)抽象工厂模式
抽象工厂模式:不同工厂背后的协作秘密 在上一期中,我们聊到了工厂模式,讲述了如何用一家咖啡店来帮我们制作不同类型的咖啡。那么,如果你不仅需要咖啡,还需要配套的甜品,比如蛋糕或饼干,这时应该…...
LeetCode:404.左叶子之和
跟着carl学算法,本系列博客仅做个人记录,建议大家都去看carl本人的博客,写的真的很好的! 代码随想录 LeetCode:404.左叶子之和 给定二叉树的根节点 root ,返回所有左叶子之和。 示例 1: 输入: …...
Java包装类型的缓存
Java 基本数据类型的包装类型的大部分都用到了缓存机制来提升性能。 Byte,Short,Integer,Long 这 4 种包装类默认创建了数值 [-128,127] 的相应类型的缓存数据,Character 创建了数值在 [0,127] 范围的缓存数据,Boolean 直接返回 True or Fal…...
2024网络安全学习路线 非常详细 推荐学习
关键词:网络安全入门、渗透测试学习、零基础学安全、网络安全学习路线 首先咱们聊聊,学习网络安全方向通常会有哪些问题 1、打基础时间太长 学基础花费很长时间,光语言都有几门,有些人会倒在学习 linux 系统及命令的路上ÿ…...
【ES6复习笔记】数值扩展(16)
介绍 在 JavaScript 中,数值扩展提供了一些额外的功能,使得处理数值变得更加方便。本教程将介绍一些常用的数值扩展方法和属性。 1. Number.EPSILON Number.EPSILON 是 JavaScript 表示的最小精度。它的值接近于 2.2204460492503130808472633361816E-…...
【mybatis】详解 # 和 $ 的区别,两者分别适用于哪种场景,使用 $ 不当会造成什么影响
# 和 $ 的区别 在MyBatis中,# 和 $ 是用来处理参数的两种不同方式,它们之间有一些重要的区别: # 符号: # 是用来进行参数占位符的,它会进行 SQL 注入防护。使用 # 时,MyBatis 会将参数值进行预处理&…...
【MySQL】索引 面试题
文章目录 适合创建索引的情况创建索引的注意事项MySQL中不适合创建索引的情况索引失效的常见情况 索引定义与作用 索引是帮助MySQL高效获取数据的有序数据结构,通过维护特定查找算法的数据结构(如B树),以某种方式引用数据…...
QT调用Sqlite数据库
QT设计UI界面,后台访问数据库,实现数据库数据的增删改查。 零售商店系统 数据库表: 分别是顾客表,订单详情表,订单表,商品表 表内字段详情如下: 在QT的Pro文件中添加sql,然后添加头…...
Flutter富文本实现学习
Flutter 代码如何实现一个带有富文本显示和交互的页面。 前置知识点学习 RealRichText RealRichText 和 ImageSpan 不是 Flutter 框架中内置的组件,而是自定义的组件或来自第三方库。这些组件的实现可以提供比标准 RichText 更丰富的功能,比如在富文本…...
实现某海外大型车企(T)Cabin Wi-Fi 需求的概述 - 4
大家好,我是Q,邮箱:1042484520qq.com。 今天我们在上几讲的基础上再扩展下 Cabin Wi-Fi 的功能需求,讲讲如何使能 5G TCU Wi-Fi STA Bridge 模式。 参考: 实现某海外大型车企(T)Cabin Wi-Fi 需求…...