行為型:觀察者模式

目錄

1、核心思想

2、實現方式

2.1 模式結構

2.2 實現案例

3、優缺點分析

4、適用場景

5、注意事項


1、核心思想

目的:針對被觀察對象與觀察者對象之間一對多的依賴關系建立起一種行為自動觸發機制,當被觀察對象狀態發生變化時主動對外發起廣播,以通知所有觀察者做出響應。核心目標是解耦主題與觀察者。

舉例

1> Websocket協議:不需要像Http輪詢服務端的狀態,服務端可以主動推送消息給客戶端

2> 商店到貨,通知購買者列表中的人來購物

2、實現方式

2.1 模式結構

四個核心角色:

  • Subject(目標主題)?:被觀察的目標主題的接口抽象,維護觀察者對象列表,并定義注冊方法register()(訂閱)與通知方法notify()(發布)?。
  • ConcreteSubject(主題實現)?:被觀察的目標主題的具體實現類,持有一個屬性狀態State,維護觀察者列表,并在狀態變化時通知觀察者。
  • Observer(觀察者)?:觀察者的接口抽象,定義響應方法update(),供主題調用。
  • ConcreteObserver(觀察者實現)?:觀察者的具體實現類,可以有任意多個子類實現。實現了響應方法update(),收到通知后進行自己獨特的處理。

2.2 實現案例

當溫度變化時,通知手機和電視更改溫度顯示:

//1、主題接口:注冊、刪除、通知觀察者
public interface Subject {void registerObserver(Observer o);void removeObserver(Observer o);void notifyObservers();
}//2、主題實現:溫度變化主題
public class WeatherStation implements Subject {private List<Observer> observers = new ArrayList<>();private float temperature;public void setTemperature(float temperature) {this.temperature = temperature;notifyObservers(); // 狀態變化時通知觀察者}@Overridepublic void registerObserver(Observer o) {observers.add(o);}@Overridepublic void removeObserver(Observer o) {observers.remove(o);}@Overridepublic void notifyObservers() {for (Observer o : observers) {o.update(temperature); // 推送數據給觀察者}}
}//3、觀察者接口
public interface Observer {void update(float temperature);
}//4、觀察者實現:手機、電視
public class PhoneDisplay implements Observer {@Overridepublic void update(float temperature) {System.out.println("手機顯示溫度更新:" + temperature + "℃");}
}public class TVDisplay implements Observer {@Overridepublic void update(float temperature) {System.out.println("電視顯示溫度更新:" + temperature + "℃");}
}//5、客戶端
public class Client {public static void main(String[] args) {WeatherStation station = new WeatherStation();PhoneDisplay phone = new PhoneDisplay();TVDisplay tv = new TVDisplay();// 注冊觀察者station.registerObserver(phone);station.registerObserver(tv);// 模擬溫度變化station.setTemperature(25.5f); // 輸出:// 手機顯示溫度更新:25.5℃// 電視顯示溫度更新:25.5℃// 移除一個觀察者station.removeObserver(tv);station.setTemperature(30.0f); // 輸出:手機顯示溫度更新:30.0℃}
}

兩種數據傳遞方式:

  • 推模型(Push Model)

    主題主動將數據推送給觀察者(如?update(temperature))。

  • 拉模型(Pull Model)

    觀察者從主題拉取所需數據(如?update()?中調用?subject.getTemperature())。

3、優缺點分析

優點:

  • 解耦:主題與觀察者無需知道彼此的具體實現。

  • 動態訂閱:運行時動態添加或移除觀察者。

  • 廣播通信:支持一對多通知,適合事件驅動系統。

  • 遵循開閉原則:新增觀察者無需修改主題代碼。

缺點:

  • 通知順序不可控:觀察者更新順序可能影響系統行為。

  • 性能問題:大量觀察者或高頻更新可能導致性能瓶頸。

  • 循環依賴風險:觀察者與主題間不當引用可能導致死循環。

4、適用場景

  • 事件驅動系統

    • 如GUI按鈕點擊事件、消息隊列通知。

  • 實時數據同步

    • 如股票價格變動通知、天氣數據更新。

  • 跨模塊狀態同步

    • 如電商系統中庫存變化觸發訂單狀態更新。

  • 分布式系統

    • 如微服務架構中的配置中心推送更新。

5、注意事項

  • 避免內存泄漏

    觀察者需及時取消注冊(如Android中Activity銷毀時移除監聽)。

  • 線程安全

    多線程環境下需同步觀察者列表(如使用?CopyOnWriteArrayList)。

  • 防止過度通知

    高頻更新場景可采用批量通知或節流機制(如每秒最多通知一次)。

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

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

相關文章

t009-線上代駕管理系統

項目演示地址 摘 要 使用舊方法對線上代駕管理系統的信息進行系統化管理已經不再讓人們信賴了&#xff0c;把現在的網絡信息技術運用在線上代駕管理系統的管理上面可以解決許多信息管理上面的難題&#xff0c;比如處理數據時間很長&#xff0c;數據存在錯誤不能及時糾正等問題…

LVS-NAT 負載均衡群集

目錄 簡介 一、LVS 與群集技術基礎 1.1 群集技術概述 1.2 負載均衡群集的分層結構 1.3 負載均衡工作模式 二、LVS 虛擬服務器核心組件與配置 2.1 LVS 內核模塊與管理工具 2.2 負載調度算法解析 2.3 ipvsadm 管理工具實戰 三、NFS 共享存儲服務配置 3.1 NFS 服務基礎…

LLaMaFactory - 支持的模型和模板 常用命令

一、 環境準備 激活LLaMaFactory環境&#xff0c;進入LLaMaFactory目錄 cd LLaMA-Factoryconda activate llamafactory 下載模型 #模型下載 from modelscope import snapshot_download model_dir snapshot_download(Qwen/Qwen2.5-0.5B-Instruct) 二、啟動一個 Qwen3-0.6B…

EDW2025|數據治理的神話破除——從誤區到現實

在當今數據驅動的世界中&#xff0c;數據治理已成為企業成功的關鍵因素。然而&#xff0c;許多組織在實施數據治理時&#xff0c;常常被一些常見的誤區所困擾。本文將逐一破除這些誤區&#xff0c;揭示數據治理的真實面貌。 誤區一&#xff1a;你需要一個大的預算&#xff01;…

AIGC與影視制作:技術革命、產業重構與未來圖景

文章目錄 一、AIGC技術全景&#xff1a;從算法突破到產業賦能1. **技術底座&#xff1a;多模態大模型的進化路徑**2. **核心算法&#xff1a;從生成對抗網絡到擴散模型的迭代** 二、AIGC在影視制作全流程中的深度應用1. **劇本創作&#xff1a;從“靈感枯竭”到“創意井噴”**2…

ReactJS 中的 JSX工作原理

文章目錄 前言? 1. JSX 是什么&#xff1f;&#x1f527; 2. 編譯后的樣子&#xff08;核心機制&#xff09;&#x1f9f1; 3. React.createElement 做了什么&#xff1f;&#x1f9e0; 4. JSX 與組件的關系&#x1f504; 5. JSX 到真實 DOM 的過程&#x1f4d8; 6. JSX 與 Fr…

Spring Advisor增強規則實現原理介紹

Spring Advisor增強規則實現原理介紹 一、什么是 Advisor&#xff1f;1. Advisor 的定義與本質接口定義&#xff1a; 2. Advisor 的核心作用統一封裝切點與通知構建攔截器鏈的基礎實現增強邏輯的靈活組合 二. Sprin當中的實現邏輯1 Advisor 接口定義2 PointcutAdvisor 接口定義…

小程序32-簡易雙向數據綁定

在WXML中&#xff0c;普通屬性的綁定是單向的&#xff0c;例如:<input value"{{value}}" /> 如果希望用戶輸入數據的同時改變data中的數據&#xff0c;可以借助簡易雙向綁定機制。在對應屬性之前添加model:前綴即可: 例如<input model:value"{{value}…

Nginx網站服務:從入門到LNMP架構實戰

&#x1f3e1;作者主頁&#xff1a;點擊&#xff01; Nginx-從零開始的服務器之旅專欄&#xff1a;點擊&#xff01; &#x1f427;Linux高級管理防護和群集專欄&#xff1a;點擊&#xff01; ??創作時間&#xff1a;2025年5月30日14點22分 前言 說起Web服務器&#xff0c…

【maker-pdf 文檔文字識別(包含ocr),安裝使用完整教程】

安裝環境 conda create -n maker-pdf python3.12 conda activate marker-pdf pip install modelscope pip install marker-pdf -U下載模型 from modelscope import snapshot_downloadmodel_root "models" snapshot_download("Lixiang/marker-pdf", loca…

C# 類和繼承(所有類都派生自object類)

所有類都派生自object類 除了特殊的類object&#xff0c;所有的類都是派生類&#xff0c;即使它們沒有基類規格說明。類object是唯 一的非派生類&#xff0c;因為它是繼承層次結構的基礎。 沒有基類規格說明的類隱式地直接派生自類object。不加基類規格說明只是指定object為 基…

尚硅谷redis7 90-92 redis集群分片之集群擴容

90 redis集群分片之集群擴容 三主三從不夠用了&#xff0c;進行擴容變為4主4從 問題&#xff1a;1.新建兩個redis實例&#xff0c;怎么加入原有集群&#xff1f;2.原有的槽位分3段&#xff0c;又加進來一個槽位怎么算&#xff1f; 新建6387、6388兩個服務實例配置文件新建后啟…

尚硅谷-尚庭公寓部署文檔

文章目錄 整合版部署文檔部署架構圖1. 項目目錄結構增加注釋的 Dockerfile 配置(1) 后端服務1 Dockerfile (backend/service1/Dockerfile)(2) 后端服務2 Dockerfile (backend/service2/Dockerfile) Dockerfile 配置說明重要注意事項3. Nginx 配置(1) 主配置文件 (nginx/nginx.c…

Android Studio 介紹

如何關閉或徹底刪除一個工程 基于Android Studio的android入門——如何關閉或徹底刪除一個工程 搜索內容 Android Studio高效指南&#xff1a;快速查找技巧大揭秘 build命令&#xff1a;gradle app:assembleDebug 命令解析 1. 命令結構與作用 核心功能&#xff1a;該命令…

JAVA與C語言之間的差異(一)

一、代碼習慣以及主函數 JAVA中{在使用的時候不要換行 public static void main(String[] args) {int[] array {1, 2, 3};for(int i 0; i < array.length; i){System.out.println(array[i] " ");}} 其次&#xff0c;以main函數為主函數&#xff1a; public …

華為OD機試真題——開放日活動/取出盡量少的球(2025A卷:200分)Java/python/JavaScript/C++/C語言/GO六種最佳實現

2025 A卷 200分 題型 本文涵蓋詳細的問題分析、解題思路、代碼實現、代碼詳解、測試用例以及綜合分析; 并提供Java、python、JavaScript、C++、C語言、GO六種語言的最佳實現方式! 本文收錄于專欄:《2025華為OD真題目錄+全流程解析/備考攻略/經驗分享》 華為OD機試真題《開放…

我的3種AI寫作節奏搭配模型,適合不同類型寫作者

—不用內耗地高效寫完一篇內容&#xff0c;原來可以這樣搭配AI ?? 開場&#xff1a;為什么要“搭配節奏”寫作&#xff1f; 很多人以為用AI寫作&#xff0c;就是丟一句提示詞&#xff0c;然后“等它寫完”。 但你有沒有遇到這些情況&#xff1a; AI寫得很快&#xff0c;學境…

【知識點】第1章:程序設計基本方法

文章目錄 知識點整理計算機的概念程序設計語言Python 語言概述Python 語言開發環境配置程序的基本編寫方法 練習題簡答題判斷題 知識點整理 計算機的概念 計算機的定義&#xff1a;計算機是根據指令操作數據的設備。 計算機的兩個基本特性&#xff1a; 功能性&#xff1a;計…

const ‘不可變’到底是值不變還是地址不變

const的基礎規則 聲明時必須初始化? const a; // ? 報錯&#xff1a;Missing initializer in const declaration const b 10; // ? 正確塊級作用域?&#xff08;const 的作用域僅限于聲明它的代碼塊&#xff09; if (true) {const x 100; } console.log(x); // ? 報錯…

Netty 實戰篇:為自研 RPC 框架加入異步調用與 Future 支持

我們在上篇實現了一個輕量級 RPC 框架&#xff0c;現在要進一步優化 —— 加入異步響應支持&#xff0c;讓 RPC 通信變得真正高效、非阻塞、支持并發。 一、為什么需要異步調用&#xff1f; 上篇的 RPC 框架是“同步阻塞”的&#xff1a; 每次發送請求后&#xff0c;必須等待服…