观察者模式 vs 发布订阅模式详解教程

🌟观察者模式 vs 发布订阅模式详解教程

收藏 + 点赞 + 关注,持续更新高频面试知识库!🚀


一、核心概念(总)

在软件开发中,观察者模式(Observer)发布订阅模式(Publish-Subscribe) 经常被提及。二者非常相似,都属于行为型设计模式,核心思想是:解耦发送者与接收者
但它们在实际使用中又有细微区别,理解清楚能帮助我们在业务代码、框架设计、架构层面灵活应用。


二、核心区别(分)

特性观察者模式(Observer)发布-订阅模式(Pub-Sub)
角色主题(Subject)+ 观察者(Observer)发布者(Publisher)+ 订阅者(Subscriber)+ 中间人(Broker)
依赖观察者直接依赖主题订阅者不依赖发布者,通过事件中心解耦
通信一对多,通知直接发送完全解耦,依赖消息通道
场景GUI、数据绑定、状态变化监听消息队列、微服务、系统解耦

👉 简单理解:
观察者模式更偏同步直接通知,发布订阅更偏异步消息总线。


三、具体讲解(深入分解)

1️⃣ 观察者模式详解

📌 设计结构:
  • Subject(被观察者):维护观察者列表,状态变更时通知观察者。
  • Observer(观察者):接收通知并做出相应处理。
📌 适用场景:
  • UI 组件更新
  • Vue 响应式系统(2.x 的 Dep)
  • 数据流监听
📌 示例代码(JavaScript 实现)
// 主题(被观察者)
class Subject {constructor() {this.observers = [];}addObserver(observer) {this.observers.push(observer);}removeObserver(observer) {this.observers = this.observers.filter(o => o !== observer);}notify(data) {this.observers.forEach(observer => observer.update(data));}
}// 观察者
class Observer {constructor(name) {this.name = name;}update(data) {console.log(`${this.name} 收到通知: ${data}`);}
}// 使用示例
const subject = new Subject();const observer1 = new Observer("观察者A");
const observer2 = new Observer("观察者B");subject.addObserver(observer1);
subject.addObserver(observer2);subject.notify("数据更新了!");
✅ 输出:
观察者A 收到通知: 数据更新了!
观察者B 收到通知: 数据更新了!

2️⃣ 发布-订阅模式详解

📌 设计结构:
  • Publisher(发布者):发送事件。
  • Subscriber(订阅者):监听事件。
  • EventBus(事件中心):负责消息分发,中间层解耦了两者。
📌 适用场景:
  • Vue / React 全局事件管理
  • 微服务架构中的消息总线
  • 复杂模块解耦
📌 示例代码(JavaScript 实现)
// 简易 EventBus 实现
class EventBus {constructor() {this.events = {};}subscribe(event, callback) {if (!this.events[event]) this.events[event] = [];this.events[event].push(callback);}unsubscribe(event, callback) {this.events[event] = this.events[event].filter(cb => cb !== callback);}publish(event, data) {if (!this.events[event]) return;this.events[event].forEach(callback => callback(data));}
}// 使用示例
const bus = new EventBus();function listenerA(data) {console.log('监听器A 收到:', data);
}
function listenerB(data) {console.log('监听器B 收到:', data);
}bus.subscribe('news', listenerA);
bus.subscribe('news', listenerB);bus.publish('news', '有新消息发布!');
✅ 输出:
监听器A 收到: 有新消息发布!
监听器B 收到: 有新消息发布!

四、总结对比(总)

对比维度观察者模式发布订阅模式
通信方式主动通知中介通知
耦合度存在一定耦合完全解耦
适用复杂度轻量简单更适合大型系统
使用典型Vue 2 响应式、数据绑定Vue3 mitt、EventBus、微服务消息

面试建议

  • 先讲两者共同点(解耦通知)
  • 再讲关键区别(是否通过中间层)
  • 最后补充应用场景(Vue、React、微服务)

五、推荐面试金句

“观察者模式是一种直接订阅、直接通知的同步模型,而发布订阅模式通过中介(事件总线)实现完全解耦**,更适用于复杂系统模块通信。”**

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

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

相关文章

【云馨AI-大模型】MD2Card:从Markdown到知识卡片的完美转变

Markdown的魅力与挑战MD2Card的核心功能使用体验与案例分析总结 在当今这个信息快速传播的时代,内容创作者们一直在寻找更有效的方式来呈现他们的想法和知识。无论是为了个人学习笔记、团队内部的知识分享还是对外的内容发布,一个清晰、美观的展示方式显…

【实战教程】OPEN API 雷池社区版自动拉黑IP

老版本使用雷池社区版的时候都需要在界面操作,但是网络攻击往往都是无规律的,每次都手动操作非常累 前一段时间雷池社区版刚好开放了OPEN API 功能,可以支持大家使用API的方式进行管理了 但是没有相关文档非常难受,一直没有使用…

Hot100——链表专项

目录 相交链表 反转链表 回文链表 环形链表 合并两个有序链表 相交链表 ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {if (headA nullptr || headB nullptr) {return nullptr;}ListNode *pA headA;ListNode *pB headB;while (pA ! pB) {pA (pA…

Java + Spring Boot 后端防抖切面类AOP代码问题排查分析

需排查分析的防抖切面类 AOP代码: package com.weiyu.aop;import com.weiyu.anno.Debounce; import com.weiyu.utils.DebounceUtil; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotatio…

【FreeRTOS-信号量】

参照正点原子以及以下gitee笔记整理本博客,并将实验结果附在文末。 https://gitee.com/xrbin/FreeRTOS_learning/tree/master 一、信号量简介 1、什么是信号量 答:信号量是一种解决同步问题的机制,可以实现对共享资源的有序访问。 假设有…

C++中decltype / auto 类型自动推导的深入讲解

一、基本定义 关键字含义出现版本auto根据初始化表达式自动推导类型C11decltype根据表达式的类型推导类型C11 二、二者区别 特性autodecltype(expr)用途声明变量获取表达式类型是否需要初始化是否(可用表达式,如函数参数)是否推导引用否&am…

Echarts数据可视化开发教程+120套开源数据可视化大屏H5模板

数据可视化跨越了语言、技术和专业的边界,是能够推动实现跨界沟通,实现国际间跨行业的创新的工具。 正如画家用颜料表达自我,作者用文字讲述故事,而统计人员用数字沟通 ...... 同样,数据可视化的核心还是传达信息。 …

华为提取版,低调使用!

大家好呀!今天想给大家推荐两款实用软件,一个是视频软件的定制版,另一个是卫星地图软件。 01 引言 之前给大家推荐过某秋音乐的定制版,结果被投诉了。以后大家推荐某秋家的软件要小心,不然很容易违规。 今天推荐的是…

天汇企业的网络设计与实现

天汇企业网络的设计与实现 摘要:互联网技术与通信技术的相互带动作用,使得两者皆呈现多样化的快速发展趋势,5G的时代序幕在已经逐渐开启,由此引发的互联网技术和设备变革必然是各界人士关注的重点,几乎所有与计算机相…

系统架构设计师:安全架构考点解析与例题

一、安全架构概述 安全架构是系统架构设计中确保信息系统安全性的重要组成部分,它定义了保护系统免受安全威胁的策略、技术和方法。安全架构需要贯穿系统设计的全生命周期,从需求分析到部署运维。 安全架构核心目标 ​​保密性​​:防止未授权访问信息​​完整性​​:防止…

计量经济学(复习/自用/未完)

补充: 1、多重共线性的补充 所谓的估计标准误,指的是回归系数的标准误差。例如回归方程: y β0 β1X1 β2X2 e 我们构建的回归方程的系数的计算得出是基于样本的。这意味着,我们每从总体中进行一次抽样,然后计算…

HarmonyOS性能优化——感知流畅优化

在应用开发中,动画可以为用户界面增添生动、流畅的交互效果,提升用户对应用的好感度。然而,滥用动画也会导致应用性能下降,消耗过多的系统资源,甚至影响用户体验。关于感知流畅度请参阅提升动画感知流畅度。 视觉感知…

基于Python的房屋信息可视化及价格预测系统

开发语言:Python框架:djangoPython版本:python3.10(必须)数据库:mysql 5.7数据库工具:Navicat12开发软件:PyCharm 系统展示 系统首页 系统登录 房价预测 房屋管理 房屋分析 个人信息 密码修改 用户管理 摘…

(17)-java+ selenium->自动化测试-元素定位大法之By css上

1.简介 CSS定位方式和xpath定位方式基本相同,只是CSS定位表达式有其自己的格式。CSS定位方式拥有比xpath定位速度快,且比CSS稳定的特性。下面详细介绍CSS定位方式的使用方法。相对CSS来说,具有语法简单,定位速度快等优点。 2.CSS定位优势 CSS定位是平常使用过程中非常重要…

高效I/O处理:模型与多路复用的探讨

目录 一、了解IO模型 (一)异步IO和同步IO (二)五种IO快速回顾 二、IO多路复用 (一)IO 多路复用模型 (二)select 实现原理 (三)poll 实现原理 &#x…

行列式展开定理(第三种定义) 线性代数

目录 1.余子式 2代数余子式 3行列式展开公式(常用) 本篇的用途是关于三阶以上行列式的一般解法。因为对于三阶以上行列式我们没有类似于2阶和三阶一样的特殊的求值办法,而对于我们上一篇讲的办法来说又太复杂了,一般考试几乎不…

一种轻量级IDS,使用新型特征选择方法进行早期APT检测

大家读完觉得有帮助记得关注和点赞!!! 高级持续性威胁 (APT) 是一种多阶段、高度复杂且隐蔽的网络威胁形式,它通过获得对网络的未授权访问来窃取有价值的数据或破坏目标网络。这些威胁通常在很长一段时间内未被发现,这…

深入理解 let、var 和 const

JavaScript 中的变量声明有三种主要方式:var、let 和 const。理解它们之间的差异对于编写清晰、有效的代码至关重要。本文将深入探讨这三种声明方式的区别、使用场景以及潜在的陷阱。 一、var 关键字 1.1 特点 函数作用域:var 声明的变量在函数内是局…

RT thread 在gd32f303平台下rtc bug date获取时间错误始终是1970

现象 时间设置指令 date 2025 6 18 10 28 00 时间获取指令 date date指定显示设置OK,但是返回的时间始终是Thu Jan 1 08:00:00 1970 msh >date local time: Thu Jan 1 08:00:00 1970 timestamps: 0 timezone: UTC+

jieba中lcut与cut的区别及用法

jieba 库中的 cut 和 lcut 是中文分词的核心函数,两者的核心区别在于​​返回类型​​和​​适用场景​​,具体对比如下: ⚙️ 1. ​​核心区别​​ ​​函数​​​​返回类型​​​​特点​​​​等价操作​​jieba.cut生成器(G…