观察者模式和发布-订阅模式有什么异同?它们在哪些情况下会被使用?
大家好,我是锋哥。今天分享关于【观察者模式和发布-订阅模式有什么异同?它们在哪些情况下会被使用?】面试题。希望对大家有帮助;

观察者模式和发布-订阅模式有什么异同?它们在哪些情况下会被使用?
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道 …...
docker compose deploy fate cluster
官方文档 写的不清晰 KubeFATE,用于生成部署脚本,链接 部署机就是下载了 KubeFATE的主机;运行机就是要安装fate容器的主机(部署机和运行机可以相同) 两个主机:并非必须 centos7,Ubuntu也行Doc…...
字节跳动Java开发面试题及参考答案(数据结构算法-手撕面试题)
怎么判断两个链表是否相交?怎么优化? 判断两个链表是否相交可以采用多种方法。 一种方法是使用双指针。首先分别遍历两个链表,得到两个链表的长度。然后让长链表的指针先走两个链表长度差的步数。之后,同时移动两个链表的指针,每次比较两个指针是否指向相同的节点。如果指…...
网工日记:FTP工作模式
FTP 基本概念 FTP(File Transfer Protocol)即文件传输协议,是用于在网络上进行文件传输的标准协议。它运行在 TCP/IP 协议栈之上,采用客户端 - 服务器(C/S)架构,通过在客户端和服务器之间建立控…...
unity使用代码在动画片段中添加event
unity使用代码在动画片段中添加event using UnityEngine;public static class AnimationHelper {/// <summary>/// 获取Animator状态对应的动画片段/// </summary>/// <param name"animator">Animator组件</param>/// <param name"…...
嵌入式轻量级开源操作系统:HeliOS的使用
嵌入式轻量级开源操作系统:HeliOS的使用 📍项目地址:https://github.com/heliosproj/HeliOS HeliOS项目是一个社区交付的开源项目,用于构建和维护HeliOS嵌入式操作系统(OS)。HeliOS是一个功能齐全的操作系统࿰…...
解决VMware的ubuntu22虚拟机没有网络
解决步骤 1.在 Windows 系统中,按 “WinR” 键,输入 “services.msc” 并回车,在服务列表中找到 “VMware DHCP Service” 和 “VMware NAT Service”,确保这两个服务已启动,若未启动则右键点击选择 “启动”…...
金属衬底介质片对平面波的反射-问题的解析求解和FEM求解
金属衬底介质片对平面波的反射-问题的解析求解和FEM求解 参考有限元从零单排系列4 代码参考了上面大佬文章提供的,但是部分计算系数错了,我改了下加了许多注释,便于大家理解。 书籍参考的电磁场有限元方法(金建铭),所用的公式都…...
2023 年 9 月青少年软编等考 C 语言四级真题解析
目录 T1. 酒鬼T2. 大盗T3. 核电站思路分析T4. 盒子与小球之二思路分析T1. 酒鬼 此题为 2021 年 3 月四级第一题原题,见 2021 年 3 月青少年软编等考 C 语言四级真题解析中的 T1。 T2. 大盗 此题为 2021 年 6 月四级第二题原题,见 2021 年 6 月青少年软编等考 C 语言四级真…...
C++的内存四区
文章目录 内存四区1.程序运行前1.1 代码区2.1 全局区2.2 示例 2.程序运行后1.1 栈区1.2 堆区 内存四区 1.程序运行前 在程序编译后,生成了exe可执行程序,未执行该程序前分为两个区域。该区域的数据在程序结束后由操作系统释放. 1.1 代码区 存放 CPU …...
Java爬虫技术:按关键字搜索VIP商品详情
在数字化时代,电子商务平台的竞争日益激烈,而精准的数据采集和分析成为了企业获取竞争优势的关键。对于电商平台而言,能够根据用户输入的关键字快速搜索并展示VIP商品的详细信息,不仅能够提升用户体验,还能够增加销售机…...
C++ —— 模板类与函数
C —— 模板类与函数 模板类可以用于函数的参数和返回值,有三种形式: 普通函数,参数和返回值是模板类的实例化版本。函数模板,参数和返回值是某种的模板类。函数模板,参数和返回值是任意类型(支持普通类和…...
【软考高级】系统架构设计师复习笔记-精华版
文章目录 前言0 系统架构设计师0.1 考架构还是考系分0.2 架构核心知识0.3 架构教材变化 1 计算机操作系统1.1 cpu 组成1.2 内核的五大功能1.3 流水线技术1.4 段页式存储1.5 I/O 软件1.6 文件管理1.7 系统工程相关 2 嵌入式2.1 嵌入式技术2.2 板级支持包(BSP…...
免费 IP 归属地接口
免费GEOIP,查询IP信息,支持IPV4 IPV6 ,包含国家地理位置,维度,asm,邮编 等,例如 例如查询1.1.1.1 http://geoip.91hu.top/?ip1.1.1.1 返回json 对象...
AIA - IMSIC之二(附IMSIC处理流程图)
本文属于《 RISC-V指令集基础系列教程》之一,欢迎查看其它文章。 1 通过IMSIC接收外部中断的CSR 软件通过《AIA - 新增的CSR》描述的CSR来访问IMSIC。 machine level 的 CSR 与 IMSIC 的 machine level interrupt file 可相互互动;而 supervisor level 的 CSR…...
数据处理之数据规约
数据处理之数据规约 1. 数据规约概述 数据规约是数据处理中的重要方法,旨在让数据处理更简便、高效,以满足业务需求。当从数据仓库获取的数据量庞大时,直接在海量数据上进行分析和挖掘成本颇高。数据规约可得到数据集的归约表示,…...
爬虫代理服务要怎么挑选?
在数据采集的世界里,爬虫代理服务不仅帮助我们高效地收集信息,还能在保护数据安全方面发挥重要作用。但面对市场上琳琅满目的代理服务,我们该如何挑选呢?本文将为你提供一些实用的建议,帮助你找到最适合你的爬虫代理服…...
vue3组件调用解决奇怪问题的详细记录
左边是父组件,右边是子组件,运行正常: 父组件中的子组件加上class属性,运行报错:Extraneous non-props attributes (class) were passed to component but could not be automatically inherited because component re…...
【物联网技术与应用】实验16:模拟霍尔传感器实验
实验16 模拟霍尔传感器实验 【实验介绍】 基于霍尔效应,霍尔传感器是响应于磁场而改变其输出电压的传感器。霍尔传感器用于接近开关,定位,速度检测和电流检测应用。 霍尔传感器可以分为模拟霍尔传感器和开关霍尔传感器由电压调节器&#x…...
【机器学习案列】车牌自动识别系统:基于YOLO11的高效实现
🧑 博主简介:曾任某智慧城市类企业算法总监,目前在美国市场的物流公司从事高级算法工程师一职,深耕人工智能领域,精通python数据挖掘、可视化、机器学习等,发表过AI相关的专利并多次在AI类比赛中获奖。CSDN…...
第19节 Node.js Express 框架
Express 是一个为Node.js设计的web开发框架,它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用,和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...
HTML 语义化
目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案: 语义化标签: <header>:页头<nav>:导航<main>:主要内容<article>&#x…...
3.3.1_1 检错编码(奇偶校验码)
从这节课开始,我们会探讨数据链路层的差错控制功能,差错控制功能的主要目标是要发现并且解决一个帧内部的位错误,我们需要使用特殊的编码技术去发现帧内部的位错误,当我们发现位错误之后,通常来说有两种解决方案。第一…...
IGP(Interior Gateway Protocol,内部网关协议)
IGP(Interior Gateway Protocol,内部网关协议) 是一种用于在一个自治系统(AS)内部传递路由信息的路由协议,主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...
UDP(Echoserver)
网络命令 Ping 命令 检测网络是否连通 使用方法: ping -c 次数 网址ping -c 3 www.baidu.comnetstat 命令 netstat 是一个用来查看网络状态的重要工具. 语法:netstat [选项] 功能:查看网络状态 常用选项: n 拒绝显示别名&#…...
使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装
以下是基于 vant-ui(适配 Vue2 版本 )实现截图中照片上传预览、删除功能,并封装成可复用组件的完整代码,包含样式和逻辑实现,可直接在 Vue2 项目中使用: 1. 封装的图片上传组件 ImageUploader.vue <te…...
WordPress插件:AI多语言写作与智能配图、免费AI模型、SEO文章生成
厌倦手动写WordPress文章?AI自动生成,效率提升10倍! 支持多语言、自动配图、定时发布,让内容创作更轻松! AI内容生成 → 不想每天写文章?AI一键生成高质量内容!多语言支持 → 跨境电商必备&am…...
sipsak:SIP瑞士军刀!全参数详细教程!Kali Linux教程!
简介 sipsak 是一个面向会话初始协议 (SIP) 应用程序开发人员和管理员的小型命令行工具。它可以用于对 SIP 应用程序和设备进行一些简单的测试。 sipsak 是一款 SIP 压力和诊断实用程序。它通过 sip-uri 向服务器发送 SIP 请求,并检查收到的响应。它以以下模式之一…...
RabbitMQ入门4.1.0版本(基于java、SpringBoot操作)
RabbitMQ 一、RabbitMQ概述 RabbitMQ RabbitMQ最初由LShift和CohesiveFT于2007年开发,后来由Pivotal Software Inc.(现为VMware子公司)接管。RabbitMQ 是一个开源的消息代理和队列服务器,用 Erlang 语言编写。广泛应用于各种分布…...
系统掌握PyTorch:图解张量、Autograd、DataLoader、nn.Module与实战模型
本文较长,建议点赞收藏,以免遗失。更多AI大模型应用开发学习视频及资料,尽在聚客AI学院。 本文通过代码驱动的方式,系统讲解PyTorch核心概念和实战技巧,涵盖张量操作、自动微分、数据加载、模型构建和训练全流程&#…...
