(十 八)趣學設計模式 之 觀察者模式!

在這里插入圖片描述

目錄

    • 一、 啥是觀察者模式?
    • 二、 為什么要用觀察者模式?
    • 三、 觀察者模式的實現方式
    • 四、 觀察者模式的優缺點
    • 五、 觀察者模式的應用場景
    • 六、 總結

🌟我的其他文章也講解的比較有趣😁,如果喜歡博主的講解方式,可以多多支持一下,感謝🤗!
🌟了解狀態模式請看: (十 七)趣學設計模式 之 狀態模式!
?更多請看個人主頁: 碼熔burning

這篇文章帶你詳細認識一下設計模式中的觀察者模式

一、 啥是觀察者模式?

想象一下,你訂閱了一個你喜歡的博主的博客 ??。 只要博主發布了新的文章,你就會立刻收到通知 🔔。 觀察者模式就像是這種訂閱機制,當一個對象(博主)的狀態發生改變時,所有依賴于它的對象(訂閱者)都會收到通知并自動更新。

觀察者模式,就是定義了一種一對多的依賴關系,讓多個觀察者對象同時監聽某一個主題對象。這個主題對象的狀態發生改變時,會通知所有觀察者對象,使它們能夠自動更新 🎁。

簡單來說,就是讓多個“粉絲”時刻關注著“偶像”,一旦“偶像”有啥動靜,“粉絲”們立刻知道!

  • 一個對象的狀態改變需要通知多個其他對象: 就像博主發布新文章需要通知所有訂閱者 📢!
  • 對象之間的依賴關系應該是松耦合的: 就像訂閱者可以隨時取消訂閱,而不會影響博主的正常運作 🤝!
  • 你需要實現發布-訂閱(Publish-Subscribe)模式: 就像博主發布文章,訂閱者接收通知 📰!

二、 為什么要用觀察者模式?

用觀察者模式,好處多多 👍:

  • 解耦主題和觀察者: 主題對象不需要知道觀察者對象的具體類型,只需要知道它們實現了觀察者接口 🤝!
  • 支持廣播通信: 主題對象可以同時通知多個觀察者對象 📣!
  • 動態添加和刪除觀察者: 可以方便地添加和刪除觀察者對象,而無需修改主題對象的代碼 ??!
  • 提高代碼的可維護性和可擴展性: 將主題和觀察者的邏輯分離,使得代碼更加清晰易懂 💡!

三、 觀察者模式的實現方式

觀察者模式主要包含兩個核心概念:

  • 主題(Subject): 也稱為可觀察對象,維護一個觀察者列表,并提供添加、刪除和通知觀察者的方法 🏠!
  • 觀察者(Observer): 定義了一個更新接口,當主題對象的狀態發生改變時,會調用這個接口來通知觀察者 ??!
// 觀察者接口:訂閱者public interface Observer {void update(String message); // 更新消息
}// 具體觀察者:用戶public class User implements Observer {private String name;public User(String name) {this.name = name;}@Overridepublic void update(String message) {System.out.println(name + " 收到消息: " + message);}
}// 主題接口:公眾號public interface Subject {void registerObserver(Observer observer); // 注冊觀察者void removeObserver(Observer observer); // 移除觀察者void notifyObservers(String message); // 通知觀察者
}// 具體主題:微信公眾號public class WeChatOfficialAccount implements Subject {private List<Observer> observers = new ArrayList<>();private String message;@Overridepublic void registerObserver(Observer observer) {observers.add(observer);}@Overridepublic void removeObserver(Observer observer) {observers.remove(observer);}@Overridepublic void notifyObservers(String message) {this.message = message;for (Observer observer : observers) {observer.update(message);}}public void publishMessage(String message) {System.out.println("公眾號發布消息: " + message);notifyObservers(message);}
}// 客戶端public class Client {public static void main(String[] args) {// 創建公眾號WeChatOfficialAccount officialAccount = new WeChatOfficialAccount();// 創建用戶User user1 = new User("張三");User user2 = new User("李四");User user3 = new User("王五");// 注冊用戶officialAccount.registerObserver(user1);officialAccount.registerObserver(user2);officialAccount.registerObserver(user3);// 發布消息officialAccount.publishMessage("今天發布了一篇新文章!");// 移除用戶officialAccount.removeObserver(user2);// 再次發布消息officialAccount.publishMessage("明天要舉辦一個活動!");}
}

代碼解釋

  • Observer 接口是觀察者接口,定義了 update 方法,用于接收主題對象發送的通知。
  • User 類是具體觀察者,實現了 Observer 接口,負責處理接收到的通知。
  • Subject 接口是主題接口,定義了 registerObserverremoveObservernotifyObservers 方法,用于管理觀察者列表和發送通知。
  • WeChatOfficialAccount 類是具體主題,實現了 Subject 接口,負責維護觀察者列表和發送通知。

輸出結果

公眾號發布消息: 今天發布了一篇新文章!
張三 收到消息: 今天發布了一篇新文章!
李四 收到消息: 今天發布了一篇新文章!
王五 收到消息: 今天發布了一篇新文章!
公眾號發布消息: 明天要舉辦一個活動!
張三 收到消息: 明天要舉辦一個活動!
王五 收到消息: 明天要舉辦一個活動!

四、 觀察者模式的優缺點

優點:

  • 解耦主題和觀察者 🤝!
  • 支持廣播通信 📣!
  • 動態添加和刪除觀察者 ??!
  • 提高代碼的可維護性和可擴展性 💡!

缺點:

  • 如果觀察者過多,通知會消耗大量資源 😫!
  • 觀察者之間可能存在循環依賴,導致系統崩潰 🤯!
  • 難以保證通知的可靠性,如果某個觀察者處理通知失敗,可能會影響其他觀察者 😞!

五、 觀察者模式的應用場景

  • GUI 事件處理: 按鈕點擊、鼠標移動等等 🖱?!
  • 消息隊列: 發布-訂閱模式 📨!
  • 股票行情: 股票價格變化通知 📈!
  • 天氣預報: 天氣變化通知 ??🌧?!

六、 總結

  • 觀察者模式就像“偶像”和“粉絲”,一旦“偶像”有啥動靜,“粉絲”們立刻知道! 🤩
  • 核心概念包括主題和觀察者! 🔑
  • 優點是解耦主題和觀察者、支持廣播通信、動態添加和刪除觀察者、提高代碼的可維護性和可擴展性! 👍
  • 缺點是如果觀察者過多,通知會消耗大量資源、觀察者之間可能存在循環依賴、難以保證通知的可靠性! 👎
  • 適用于一個對象的狀態改變需要通知多個其他對象,并且對象之間的依賴關系應該是松耦合的場景! 🎯

希望這篇文章能讓你徹底理解觀察者模式! 💯 祝你學習愉快! 😄
看完請看:(十 九)趣學設計模式 之 中介者模式!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/71540.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/71540.shtml
英文地址,請注明出處:http://en.pswp.cn/web/71540.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Spring Boot 緩存最佳實踐:從基礎到生產的完整指南

Spring Boot 緩存最佳實踐&#xff1a;從基礎到生產的完整指南 引言 在現代分布式系統中&#xff0c;緩存是提升系統性能的銀彈。Spring Boot 通過 spring-boot-starter-cache? 模塊提供了開箱即用的緩存抽象&#xff0c;但如何根據業務需求實現靈活、可靠的緩存方案&#xf…

蘋果Siri升級遇阻,國行iPhone或將引入阿里、百度AI自救

AI整合進展緩慢 蘋果正加速將生成式AI技術整合至Siri&#xff0c;但內部消息稱其底層技術研發落后于競爭對手&#xff0c;進展未達預期。 國行iPhone將引入雙AI模型 蘋果計劃在2025年中期為國行iPhone引入AI功能&#xff0c;目前已敲定與 阿里巴巴、百度 合作&#xff0c;用戶…

阿里推出全新推理模型(因果語言模型),僅1/20參數媲美DeepSeek R1

阿里Qwen 團隊正式發布了他們最新的研究成果——QwQ-32B大語言模型&#xff01;這款模型不僅名字萌萌噠(QwQ)&#xff0c;實力更是不容小覷&#xff01;&#x1f60e; QwQ-32B 已在 Hugging Face 和 ModelScope 開源&#xff0c;采用了 Apache 2.0 開源協議。大家可通過 Qwen C…

TomcatServlet

https://www.bilibili.com/video/BV1UN411x7xe tomcat tomcat 架構圖&#xff0c;與 jre&#xff0c;應用程序之前的關系 安裝使用 tomcat 10 開始&#xff0c;api 從 javax.* 轉為使用 jakarta.*&#xff0c;需要至少使用 jdk 11 cmd 中默認 gbk 編碼&#xff0c;解決控制…

JDK ZOOKEEPER KAFKA安裝

JDK17下載安裝 mkdir -p /usr/local/develop cd /usr/local/develop 將下載的包上傳服務器指定路徑 解壓文件 tar -zxvf jdk-17.0.14_linux-x64_bin.tar.gz -C /usr/local/develop/ 修改文件夾名 mv /usr/local/develop/jdk-17.0.14 /usr/local/develop/java17 配置環境變量…

高考數學。。。

2024上 具體來說&#xff0c;直線的參數方程可以寫為&#xff1a; x1t y?t z1t 二、簡答題(本大題共5小題&#xff0c;每小題7分&#xff0c;共35分。) 12.數學學習評價不僅要關注結果評價&#xff0c;也要關注過程評價。簡要說明過程評價應關注哪幾個方面。…

C# 實現鼠標軌跡錄制與回放自動化功能(附源碼)

在軟件自動化測試或者重復性辦公任務中&#xff0c;鼠標操作的自動化可以大大減少人工干預&#xff0c;提高工作效率。這里將詳細介紹如何使用 C# 實現鼠標軌跡的錄制與回放功能&#xff0c;代碼結構清晰&#xff0c;具有較強的擴展性。 引用 NuGet 包 在開發這個功能時&…

Nacos 核心功能實戰筆記(超詳細)

Nacos 核心功能實戰筆記 一、Nacos 簡介 1. 是什么&#xff1f; 全稱&#xff1a;Nacos Naming and Configuration Service定位&#xff1a;阿里巴巴開源的 動態服務發現、配置管理、服務管理平臺核心功能&#xff1a;服務注冊與發現 統一配置管理 服務健康監測適用場景&…

安裝remixd,在VScode創建hardhat

在終端&#xff0c;以管理員身份&#xff0c;cmd 需要科學上網 npm install -g remix-project/remixd 在vscode插件中&#xff0c;安裝solidity插件&#xff0c;是暗灰色那款 1.將nodeJs的版本升級至18以上 2.在vscode打開一個新的文件&#xff0c;在終端輸入 npx hardhat 3.…

unity pico開發 四 物體交互 抓取 交互層級

文章目錄 手部設置物體交互物體抓取添加抓取抓取三種類型抓取點偏移抓取事件抓取時不讓物體吸附到手部 射線抓取交互層級 手部設置 為手部&#xff08;LeftHandController&#xff09;添加XRDirInteractor腳本 并添加一個球形碰撞盒&#xff0c;勾選isTrigger,調整大小為0.1 …

CyberRT(apollo) 定時器模塊簡述及bug分析

timer 模塊 timer的定義&#xff0c;cyberrt中timer模塊用于設置定時器任務&#xff0c;字面意思&#xff0c;設置設置定時周期及出發頻次&#xff08;周期 or oneshot)&#xff0c;到達指定時間時間觸發callback time wheel 時鐘節拍輪&#xff0c;常見的定時器設計&#x…

java八股文之消息中間件

1.RabbitMQ如何保證消息不丟失 開啟生產者確認機制&#xff0c;確保生產者的消息能到達隊列開啟持久化功能&#xff0c;確保消息未消費前在隊列中不會丟失&#xff08;交換機&#xff0c;隊列&#xff0c;消息都需要開啟持久化功能&#xff09;開啟消費者確認機制為auto,由spr…

Win7重裝不翻車!ISO鏡像安全下載渠道+BIOS設置避雷手冊

一、寫在前面&#xff1a;為什么你需要這份教程&#xff1f; 當電腦頻繁藍屏、系統崩潰甚至無法開機時&#xff0c;重裝系統可能是最后的救命稻草。但市面上的教程往往存在三大痛點&#xff1a; ?? 鏡像來源不明導致系統被植入后門 ?? 啟動盤制作失敗反復折騰 ?? 操作失…

大學至今的反思與總結

現在是2025年的3月5日&#xff0c;我大三下學期。 自大學伊始&#xff0c;我便以考研作為自己的目標&#xff0c;有時還會做自己考研上岸頭部985,211&#xff0c;offer如潮水般涌來的美夢。 但是我卻忽略了一點&#xff0c;即便我早早下定了決心去考研&#xff0c;但并沒有早…

SpringBoot 全局異常處理

文章目錄 異常處理全局異常處理(推薦)局部異常處理高級技巧設置返回狀態碼處理404異常異常處理 全局異常處理(推薦) 創建一個全局異常處理類,使用 @RestControllerAdvice 注解標記。 在方法上使用 @ExceptionHandler 聲明當前方法可處理的異常類型。當系統發生異常時,…

【四.RAG技術與應用】【11.阿里云百煉應用(上):RAG在云端的實踐】

一、為什么需要RAG?大模型的“知識困境”與破局之道 大模型雖然“博學”,但它的知識庫存在兩個致命短板: 缺乏私有知識:比如企業內部的產品手冊、客戶數據、行業報告等;知識更新滯后:大模型的訓練數據往往停留在某個時間點,無法實時獲取最新信息(比如今天的股票行情或…

使用wifi連接手機adb進行調試|不使用數據線adb調試手機|找應用錯誤日志和操作日志

手機在開發者選項里要開啟無線調試 在手機設置中查看WiFi的IP地址 設置 -> WLAN -> 已連接的WiFi -> IP地址 使用手機的IP地址連接 adb connect 192.168.1.12:xxxxx 檢查連接狀態 adb devices 斷開特定設備 adb disconnect 192.168.x.x:xxxxx 斷開所有設備 …

mapbox高階,結合threejs(threebox)添加三維球體

????? 主頁: gis分享者 ????? 感謝各位大佬 點贊?? 收藏? 留言?? 加關注?! ????? 收錄于專欄:mapbox 從入門到精通 文章目錄 一、??前言1.1 ??mapboxgl.Map 地圖對象1.2 ??mapboxgl.Map style屬性1.3 ??threebox Sphere靜態對象二、??使用t…

游戲引擎學習第140天

回顧并為今天的內容做準備 目前代碼的進展到了聲音混音的部分。昨天我詳細解釋了聲音的處理方式&#xff0c;聲音在技術上是一個非常特別的存在&#xff0c;但在游戲中進行聲音混音的需求其實相對簡單明了&#xff0c;所以今天的任務應該不會太具挑戰性。 今天我們會編寫一個…

golang并發編程如何學習

《掌握 Golang 并發編程的通關秘籍》 在當今的編程世界中&#xff0c;Golang 并發編程正以其獨特的魅力和強大的能力吸引著眾多開發者。然而&#xff0c;對于許多小伙伴來說&#xff0c;如何學好這門技術卻成了一個頭疼的問題。別擔心&#xff0c;今天就讓我來為大家揭開 Gola…