觀察者模式 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
英文地址,請注明出處:http://en.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…