Java設計模式之行為型模式(觀察者模式)介紹與說明

一、模式結構

觀察者模式包含以下四個角色:

  1. Subject(主題/被觀察者)
    • 維護觀察者列表,提供注冊(registerObserver)、移除(removeObserver)觀察者的方法,并定義通知所有觀察者的方法(notifyObservers)。
    • 示例:天氣數據(WeatherData)、優衣庫品牌決策(UniqloBrandDecision)。
  2. Observer(觀察者)
    • 定義更新接口(update),用于接收主題的通知并執行響應邏輯。
    • 示例:天氣顯示組件(CurrentConditionsDisplay)、消費者(Consumer)。
  3. ConcreteSubject(具體主題)
    • 實現主題接口,管理觀察者列表,并在狀態變化時觸發通知。例如,WeatherData類在溫度、濕度等數據更新時調用notifyObservers
  4. ConcreteObserver(具體觀察者)
    • 實現觀察者接口,定義具體響應邏輯。例如,CurrentConditionsDisplay在接收到數據后更新顯示內容。

二、核心實現步驟

  1. 定義觀察者接口:聲明update方法,參數可為數據對象或主題引用(推模型或拉模型)。
  2. 實現具體觀察者:在update方法中處理主題狀態變化,例如更新UI或執行業務邏輯。
  3. 定義主題接口:包含觀察者管理方法和通知方法。
  4. 實現具體主題:維護觀察者列表,在狀態變化時遍歷并調用update方法。

三、代碼示例(氣象站系統)

// 觀察者接口
public interface Observer {void update(float temp, float humidity, float pressure);
}
// 主題接口
public interface Subject {void registerObserver(Observer o);void removeObserver(Observer o);void notifyObservers();
}
// 具體主題類(天氣數據)
public class WeatherData implements Subject {private List observers = new ArrayList<>();private float temperature, humidity, pressure;@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, humidity, pressure);}}public void measurementsChanged() {notifyObservers();}public void setMeasurements(float temp, float humidity, float pressure) {this.temperature = temp;this.humidity = humidity;this.pressure = pressure;measurementsChanged();}
}
// 具體觀察者類(當前天氣顯示)
public class CurrentConditionsDisplay implements Observer {private float temp, humidity;@Overridepublic void update(float temp, float humidity, float pressure) {this.temp = temp;this.humidity = humidity;display();}private void display() {System.out.println("當前溫度:" + temp + "℃,濕度:" + humidity + "%");}
}

四、適用場景

  1. 事件驅動系統:如GUI事件處理、按鈕點擊監聽。
  2. 實時數據監控:股票價格變動、傳感器數據更新。
  3. 訂閱/發布模型:郵件訂閱、RSS訂閱、消息隊列。
  4. 跨模塊通知:訂單狀態變更通知多個服務。

五、優缺點分析

優點缺點
- 解耦主題與觀察者,符合開閉原則。- 觀察者過多時性能下降。
- 動態擴展觀察者,無需修改核心邏輯。- 通知順序不可控,可能引發依賴鏈問題。
- 支持廣播通信,實現事件驅動機制。- 循環依賴可能導致棧溢出。

六、高級應用與優化

  1. 異步通知:使用線程池處理觀察者回調,避免阻塞主題線程。
  2. 事件參數化:通過事件對象(如VoteEvent)傳遞具體數據,增強靈活性。
  3. 弱引用機制:防止內存泄漏(如使用WeakReference存儲觀察者)。
  4. 分布式擴展:結合消息隊列(如Kafka)實現跨進程觀察者。

七、Java內置支持(已過時)

JDK提供java.util.ObservableObserver類,但因設計缺陷(如需手動調用setChanged())已被標記為過時。推薦自定義實現或使用現代框架(如Spring的ApplicationEvent)。


總結

觀察者模式通過解耦主題與觀察者,實現了靈活的通知機制,廣泛應用于事件驅動、實時監控等場景。開發者需權衡性能與擴展性,合理設計通知模型(推/拉)和生命周期管理。

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

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

相關文章

實現一個點擊輸入框可以彈出的數字軟鍵盤控件 qt 5.12

我們將創建兩個自定義組件&#xff1a; 1. NumericInputField&#xff1a;一個輸入框&#xff0c;當點擊時彈出數字鍵盤。 2. NumericKeyboard&#xff1a;一個可縮放的數字鍵盤。 設計思路&#xff1a; - NumericInputField 是一個常規的輸入框&#xff0c;但點擊后會彈出 Num…

Java 深入解析:JVM對象創建與內存機制全景圖

第一章&#xff1a;引言 Java 是一種面向對象的編程語言&#xff0c;對象&#xff08;Object&#xff09;是其最基本的組成單位。Java 的“一切皆對象”不僅體現在語法層面&#xff0c;更體現在運行時&#xff0c;幾乎所有數據都以對象形式存在于內存中。 然而&#xff0c;很…

Redis 基本操作筆記

1. Redis 簡介 Redis&#xff08;Remote Dictionary Server&#xff09;是一個開源的、高性能的鍵值對存儲系統&#xff0c;通常作為數據庫、緩存、消息中間件等使用。它支持多種數據類型&#xff0c;包括字符串、哈希、列表、集合、有序集合等。 Redis 特點&#xff1a; 性能&…

Docker從環境配置到應用上云的極簡路徑

Docker從環境配置到應用上云的極簡路徑主要包括環境配置、應用容器化、選擇云平臺及部署應用等步驟&#xff0c;具體如下&#xff1a; - 配置Docker環境&#xff1a; - 安裝Docker&#xff1a;根據操作系統下載對應版本的Docker安裝包。如在Linux系統中&#xff0c;可使用命令…

Slicer渲染Dicom到nrrd

Slicer渲染Dicom到nrrd 工作中遇到一些處理Dicom數據的需求&#xff0c;個人通過網絡上的一些教程 對于原始數據嘗試轉換到nrrd時&#xff0c;發現部分的窗體數據的渲染方向不一致 進一步發現這些很多定義的方向是跟設備廠家強相關的&#xff0c;不同廠家對于同一段的Dicom參…

QT中設計qss字體樣式但是沒有用【已解決】

檢查一下stylesheet里面是不是有不能被QT讀取的CSS語言&#xff0c;可能會跟字體顏色沖突錯誤示范&#xff1a;/* 錯誤示例&#xff1a;QSS 中使用 box-shadow */ QPushButton {box-shadow: 0 4px 8px rgba(0, 0, 0, 0.3); /* Qt 不支持此屬性 */ }刪掉就行了如果后續想用陰影…

uniapp獲取狀態欄高度,膠囊按鈕的高度,底部安全區域的高度,自定義導航欄

相關API uni.getSystemInfoSync() uni.getMenuButtonBoundingClientRect() 創建一個utils文件夾&#xff0c;該文件下封裝一個systemInfo.js /*** 系統信息工具類* 封裝獲取系統狀態欄、導航欄和安全區域等相關信息的方法*/// 獲取系統信息并緩存 const systemInfo uni.get…

jQuery 文本屬性值

一、前言在網頁開發中&#xff0c;我們經常需要對頁面上的文本內容進行操作&#xff0c;例如動態修改段落文字、讀取用戶輸入框的內容、更新按鈕文本等。jQuery 提供了簡潔而強大的方法來處理這些常見的文本操作需求。本文將帶你全面了解 jQuery 中用于操作文本內容的三個核心方…

JAVA并發——為什么Java中的ThreadLocal對key的引用為弱引用

1、ThreadLocal 的用途 給每個線程提供自己獨立的變量副本&#xff0c;實現線程間隔離。 常用于&#xff1a; 數據庫連接、Session 緩存、用戶上下文&#xff08;如 userId&#xff09;線程池中的線程復用時避免共享污染&#xff1b;實現線程封閉的設計模式 2、內存泄漏 使用弱…

【C++】多線程同步三劍客介紹

目錄 條件變量 頭文件 主要操作函數 1、等待操作 2、喚醒操作 使用示例 信號量 頭文件 主要操作函數 1、信號量初始化 2、等待操作&#xff08;P操作&#xff09; 3、信號操作&#xff08;V操作&#xff09; 4、獲取信號量值 5、銷毀信號量 使用示例 互斥鎖 …

《Java Web程序設計》實驗報告八 JSP+Servlet+JDBC+MySQL實現課程管理

目 錄 一、實驗目的 二、實驗環境 三、實驗步驟和內容 1、小組成員分工&#xff08;共計4人&#xff09; 2、實驗方案 3、實驗結果與分析 4、項目任務評價 四、遇到的問題和解決方法 五、實驗總結 一、實驗目的 1、掌握mysql的安裝、數據庫表單創建 2、掌握JDBC的鏈接…

基于數據挖掘的課程推薦系統研究

摘要本研究設計并開發了一套基于先進數據挖掘技術的智能化課程推薦系統。該系統創新性地采用了協同過濾算法與內容推薦算法相結合的混合推薦策略&#xff0c;通過深度分析學生在學習平臺上的歷史行為數據&#xff08;包括選課記錄、學習時長、測試成績等&#xff09;以及課程的…

【SCI 4區推薦】《Journal of Visual Communication and Image Representation》

期刊簡介&#xff1a;《視覺傳達與圖像表示雜志》&#xff08;Journal of Visual Communication and Image Representation&#xff09;致力于發表視覺傳達與圖像表示領域的最前沿研究&#xff0c;特別強調多學科交叉領域中的新技術和理論應用。這本期刊涵蓋的研究范圍廣泛&…

20250711_Sudo 靶機復盤

target:192.168.43.20 外部打點 &#xff08;文件上傳&#xff09; nmap掃一下&#xff0c;80,22 開放 掃目錄&#xff0c;發現 README.md [17:04:30] 200 - 664B - /Dockerfile [17:04:38] 200 - 34KB - /LICENSE …

STEP 7-Micro/WIN SMART 編程軟件:從入門到精通的使用指南

STEP 7-Micro/WIN SMART 編程軟件&#xff1a;從入門到精通的使用指南 在工業自動化控制領域&#xff0c;編程軟件是連接工程師與 PLC 的橋梁&#xff0c;而 STEP 7-Micro/WIN SMART 作為 S7-200 SMART PLC 的專用編程工具&#xff0c;以其友好的界面和高效的編程能力備受青睞。…

模型訓練與部署注意事項篇---resize

圖像大小的影響在 YOLOv 系列模型的訓練和推理部署過程中&#xff0c;圖像大小的選擇是影響模型性能&#xff08;精度、速度、泛化能力&#xff09;的關鍵因素之一。兩者的關系既相互關聯&#xff0c;又存在一定的靈活性&#xff0c;具體可從以下幾個方面詳細分析&#xff1a;一…

【Python】venv:配置獨立鏡像源

為某個特定的 venv 虛擬環境設置 pip 鏡像源&#xff0c;使得該環境下的 pip 安裝始終使用自定義鏡像源&#xff0c;不影響系統 pip&#xff0c;也不依賴用戶級配置文件。環境準備 1. 創建虛擬環境 python -m venv venv2. 激活虛擬環境Windows: .\venv\Scripts\activateLinux/m…

日本語言學校:簽證制度類 Prompt 的結構整理路徑與策略

日本語言學校&#xff1a;簽證制度類 Prompt 的結構整理路徑與策略 我們在構建語言留學語義系統的過程中&#xff0c;嘗試以“簽證風險”為例&#xff0c;探索如何讓結構信息被更好地保留下來。本文不介紹 Prompt 本身&#xff0c;也不夸大其作用&#xff0c;而是希望借此與更…

RFCOMM協議詳解:串口仿真與TCP/IP協議棧移植技術——面試高頻考點與真題解析

一、RFCOMM 協議核心考點與高頻面試問題1.1 協議基礎與核心功能考點解析&#xff1a;RFCOMM&#xff08;Radio Frequency Communication&#xff09;是藍牙協議棧中實現串口仿真的核心協議&#xff0c;基于 L2CAP 協議提供類似 RS-232 的可靠數據流傳輸。其核心功能包括&#x…

【編程實踐】利用open3d生成物體的最長邊方向并可視化

1 利用3d軟件生成一個長方體 邊長隨意&#xff0c;長度隨意 2 導出為模型文件并采樣為點云數據 從mesh表面進行采樣&#xff0c;點數根據自己需求進行設置&#xff0c;此處設置為100000。采樣結果&#xff1a;3 識別OBB外接框并可視化長邊方向import numpy as np import open3d…