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

观察者模式和发布-订阅模式有什么异同?它们在哪些情况下会被使用?
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…...
Wan2.2-I2V-A14B提示工程实践:提升视频连贯性的5类prompt模板
Wan2.2-I2V-A14B提示工程实践:提升视频连贯性的5类prompt模板 1. 模型与镜像概述 Wan2.2-I2V-A14B是一款先进的文生视频模型,能够根据文本描述生成高质量视频内容。该模型通过私有部署镜像形式提供,已针对RTX 4090D 24GB显存配置进行深度优…...
nanobot轻量级OpenClaw部署:支持LoRA微调接口(/api/finetune)预留设计
nanobot轻量级OpenClaw部署:支持LoRA微调接口(/api/finetune)预留设计 1. nanobot简介:超轻量级个人AI助手 nanobot是一款受OpenClaw启发的超轻量级个人人工智能助手,仅需约4000行代码即可提供核心代理功能ÿ…...
编译生成设计师插件
Qt/C精美控件源码(共202个支持Qt4、Qt5、Qt6)/可视化拖曳开发 1. 超过188个精美控件并持续不断迭代更新升级,种类超多,控件类型极其丰富。 2. 涵盖了各种仪表盘、进度条、进度球、指南针、曲线图、标尺、温度计、导航条、导航栏,flatui、高亮…...
基于SpringBoot + Vue的眼科患者随访管理系统(角色:患者、医生、管理员)
文章目录前言一、详细操作演示视频二、具体实现截图三、技术栈1.前端-Vue.js2.后端-SpringBoot3.数据库-MySQL4.系统架构-B/S四、系统测试1.系统测试概述2.系统功能测试3.系统测试结论五、项目代码参考六、数据库代码参考七、项目论文示例结语前言 💛博主介绍&#…...
OpenClaw+千问3.5-27B代码助手:自动生成Python脚本并测试运行
OpenClaw千问3.5-27B代码助手:自动生成Python脚本并测试运行 1. 为什么需要代码生成与执行的自动化? 作为开发者,我经常遇到这样的场景:脑子里有个想法需要快速验证,比如抓取某个网站的数据做分析。传统流程是手动写…...
搜索关键词SEO优化需要多长时间才能看到效果_搜索关键词SEO优化需要多少预算投入
搜索关键词SEO优化需要多长时间才能看到效果_搜索关键词SEO优化需要多少预算投入 在当今互联网时代,搜索引擎优化(SEO)是每个网站和在线企业提升流量、吸引潜在客户的重要手段。许多人在进行SEO优化时常常会疑惑:“搜索关键词SEO…...
OpenClaw多通道实战:百川2-13B-4bits同时接入飞书与钉钉机器人
OpenClaw多通道实战:百川2-13B-4bits同时接入飞书与钉钉机器人 1. 为什么需要多通道接入? 上个月我们市场部遇到一个典型问题:产品团队用飞书沟通,而运营团队坚持使用钉钉。当我用OpenClaw搭建了一个基于百川2-13B的智能助手后&…...
OpenClaw内存泄漏排查:Qwen3-32B长会话任务监控与优化
OpenClaw内存泄漏排查:Qwen3-32B长会话任务监控与优化 1. 问题背景:当OpenClaw遇上长会话任务 上周我尝试用OpenClaw自动化处理一批技术文档的摘要生成工作。这个任务需要连续处理上百个Markdown文件,每个文件都需要调用Qwen3-32B模型进行多…...
DS1307实时时钟芯片驱动开发与工程实践指南
1. DS1307实时时钟芯片驱动技术深度解析DS1307是由Maxim Integrated(现为Analog Devices)推出的经典IC接口实时时钟(RTC)芯片,采用SOIC-8封装,工作电压范围2.0V–5.5V,支持-40C至85C工业级温度范…...
飞腾D3000M一体机主板硬核动力打破金融移动终端应用落地壁垒
数字经济浪潮下,金融行业正加速迈入“移动化信创化”双轮驱动时代,移动终端已成为连接金融机构与客户的核心枢纽,承载着交易结算、风险管控、服务触达等关键职能。然而,金融场景的特殊性的要求,让终端设备不仅需要强劲…...
