Java設計模式之觀察者模式:從基礎到高級的全面解析

文章目錄

    • 一、觀察者模式基礎概念
      • 1.1 什么是觀察者模式?
      • 1.2 觀察者模式的四大角色
      • 1.3 觀察者模式類圖
    • 二、觀察者模式實現步驟
      • 2.1 基礎實現步驟
      • 2.2 詳細代碼實現
        • 第一步:定義主題接口
        • 第二步:定義觀察者接口
        • 第三步:創建具體主題
        • 第四步:創建具體觀察者
        • 第五步:客戶端使用
    • 三、觀察者模式深入解析
      • 3.1 推模型 vs 拉模型
      • 3.2 Java內置的觀察者模式支持
      • 3.3 觀察者模式與發布-訂閱模式的區別
    • 四、觀察者模式高級應用
      • 4.1 觀察者模式與Swing事件監聽
      • 4.2 使用Lambda表達式簡化觀察者
      • 4.3 觀察者模式與Spring事件機制
    • 五、觀察者模式最佳實踐與注意事項
      • 5.1 觀察者模式最佳實踐
      • 5.2 線程安全的觀察者模式實現
      • 5.3 觀察者模式常見問題及解決方案
    • 六、觀察者模式與其他模式的關系
      • 6.1 觀察者模式與中介者模式
      • 6.2 觀察者模式與責任鏈模式
      • 6.3 觀察者模式與MVC架構
    • 七、實際應用案例:電商價格監控系統
      • 7.1 類設計
      • 7.2 代碼實現
      • 7.3 運行結果
    • 八、總結

觀察者模式是Java中最常用的行為型設計模式之一,它定義了對象之間的一對多依賴關系,當一個對象改變狀態時,所有依賴它的對象都會得到通知并自動更新。本文將帶你全面了解觀察者模式,從基礎概念到高級應用,通過日常生活的例子幫助你深入理解。

一、觀察者模式基礎概念

1.1 什么是觀察者模式?

觀察者模式(Observer Pattern)又稱為發布-訂閱模式(Publish-Subscribe Pattern),它定義了一種一對多的依賴關系,讓多個觀察者對象同時監聽某一個主題對象。當主題對象狀態發生變化時,它會通知所有觀察者對象,使它們能夠自動更新自己。

生活中的例子:想象你訂閱了一份雜志。雜志社(主題)維護了一個訂閱者(觀察者)列表。當新一期雜志出版時,雜志社會自動將雜志發送給所有訂閱者。你不需要每天去書店查看新雜志是否到貨,雜志社會在合適的時候通知你。

1.2 觀察者模式的四大角色

角色描述對應生活例子
Subject(主題)被觀察的對象,維護觀察者列表,提供添加/刪除觀察者的方法雜志社

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

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

相關文章

GATT 服務的核心函數bt_gatt_discover的介紹

目錄 概述 1 GATT 基本概念 1.1 GATT 的介紹 1.2 GATT 的角色 1.3 核心組件 1.4 客戶端操作 2 bt_gatt_discover函數的功能和應用 2.1 函數介紹 2.1 發現類型(Discover Type) 3 典型使用流程 3.1 服務發現示例 3.2 級聯發現模式 3.3 按UUID過…

【更新至2023年】1985-2023年全國及各省就業人數數據(無缺失)

1985-2023年全國及各省就業人數數據(無缺失) 1、時間:1985-2023年 2、來源:Z國統計年鑒、各省年鑒、新中國60年 3、指標:就業人數 4、范圍:全國及31省 5、缺失情況:無缺失 6、指標解釋&am…

0基礎學習Linux之揭開朦朧一面:環境基礎開發工具

目錄 Linux下安裝軟件的方案: 對于操作系統的理解: 操作系統的生態問題: 什么是好的操作系統(os): 重新理解centos VS ubnutu VS kail: 關于yum: 用 yum 安裝軟件(安裝和卸載軟件一定要有r…

YOLO 算法詳解:實時目標檢測的里程碑

在計算機視覺領域,目標檢測一直是一個關鍵且熱門的研究方向,而 YOLO(You Only Look Once)算法憑借其出色的實時性和較高的檢測精度,成為了目標檢測算法中的明星選手。本文將深入探討 YOLO 算法的原理、發展歷程、技術優…

leetcode98.驗證二叉搜索樹:遞歸法中序遍歷的遞增性驗證之道

一、題目深度解析與BST核心性質 題目描述 驗證二叉搜索樹(BST)是算法中的經典問題,要求判斷給定的二叉樹是否滿足BST的定義: 左子樹中所有節點的值嚴格小于根節點的值右子樹中所有節點的值嚴格大于根節點的值左右子樹本身也必須…

MathQ-Verify:數學問題驗證的五步流水線,為大模型推理筑牢數據基石

MathQ-Verify:數學問題驗證的五步流水線,為大模型推理筑牢數據基石 大語言模型在數學推理領域進展顯著,但現有研究多聚焦于生成正確推理路徑和答案,卻忽視了數學問題本身的有效性。MathQ-Verify,通過五階段流水線嚴格…

八股戰神-JVM知識速查

1.JVM組成 JVM由那些部分組成,運行流程是什么? JVM是Java程序的運行環境 組成部分: 類加載器:加載字節碼文件到內存 運行時數據區:包括方法區,堆,棧,程序計數器,本地…

Maven:在原了解基礎上對pom.xml文件進行詳細解讀

一、pom.xml文件 就像項目管理軟件 Make 的 MakeFile、Ant 的 build.xml 一樣,Maven 項目的核心是 pom.xml。POM( Project Object Model,項目對象模型 ) 定義了項目的基本信息,用于描述項目如何構建,聲明項目依賴,等等…

Spring Cloud項目登錄認證從JWT切換到Redis + UUID Token方案

背景介紹 在傳統的Spring Boot項目中,用戶登錄認證常見的方案是使用JWT(JSON Web Token)來實現無狀態的身份驗證。JWT憑借自包含用戶信息、方便前后端分離、性能較好等優勢被廣泛采用。 然而,在實際項目中,JWT也有一…

MongoDB 快速整合 SpringBoot 示例

1.添加依賴<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spr…

Flyweight(享元)設計模式 軟考 享元 和 代理屬于結構型設計模式

1.目的&#xff1a;運用共享技術有效地支持大量細粒度的對象 Flyweight&#xff08;享元&#xff09;設計模式 是一種結構型設計模式&#xff0c;它的核心目的是通過共享對象來減少內存消耗&#xff0c;特別是在需要大量相似對象的場景中。Flyweight 模式通過將對象的共享細節與…

002大模型-提示詞工程,少樣本提示,角色扮演,思維鏈

一、提示詞工程 二、少樣本提示 三、角色扮演 四、思維鏈

華為OD機試真題——傳遞悄悄話(二叉樹最長路徑問題)(2025A卷:200分)Java/python/JavaScript/C/C++/GO最佳實現

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

「讀書報告」Spark實時大數據分析

這本書是清華大學出版社2018年出版的&#xff0c;我是2020年讀的&#xff0c;說真的的&#xff0c;不怎么喜歡這本書&#xff0c;所以作者我都不想提。有的人可能會奇怪&#xff0c;ailx10&#xff0c;你一個搞網絡安全的&#xff0c;怎么會去讀大數據相關的書&#xff0c;哎&a…

2025 河北ICPC( D. 金泰園(二分)-- C.年少的誓約(公式轉化))

文章目錄 2025 河北ICPCD. 金泰園&#xff08;二分&#xff09;C.年少的誓約(公式轉化)總結 2025 河北ICPC 題目鏈接&#xff1a; Attachments - The 9th Hebei Collegiate Programming Contest - Codeforces sdccpc20250522 - Virtual Judge 賽時&#xff1a;5道 D. 金泰…

QT學習一

對于選擇qmake還是cmake&#xff0c;現在寫的暫時先用qmake 1.命名規范和快捷鍵 2.按鈕控件常用API //創建第一個按鈕QPushButton * btn new QPushButton;//讓btn對象 依賴在mywidget窗口中btn->setParent(this);//顯示文本btn->setText("第一個按鈕");//創建…

【Elasticsearch】給所索引創建多個別名

Elasticsearch 是可以給索引創建多個別名的。 為什么可以創建多個別名 1. 靈活性 - 別名可以為索引提供一個更易于理解的名稱&#xff0c;方便用戶根據不同的業務場景或用途來引用同一個索引。例如&#xff0c;一個索引可能同時服務于多個不同的應用程序或服務&#xff0c;通…

使用 OpenCV 實現哈哈鏡效果

在計算機視覺和圖像處理領域&#xff0c;OpenCV 提供了非常強大的圖像幾何變換能力&#xff0c;不僅可以用于糾正圖像&#xff0c;還能制造各種“有趣”的視覺效果。今天&#xff0c;我們就來實現一個經典的“哈哈鏡”效果&#xff0c;讓圖像像在游樂園里一樣被拉伸、壓縮、扭曲…

AI|Java開發 IntelliJ IDEA中接入本地部署的deepseek方法

目錄 連接本地部署的deepseek&#xff1a; IntelliJ IDEA中使用deepseek等AI&#xff1a; 用法一&#xff1a;讓AI寫代碼 用法二&#xff1a;選中這段代碼&#xff0c;右鍵&#xff0c;可以讓其解釋這段代碼的含義。這時顯示的解釋是英文的。 連接本地部署的deepseek&#…

如何使用兩塊硬盤作為 Ubuntu24 的系統盤,實現壞掉一塊不影響系統運行。

最近我想使用Ubuntu組一個NAS系統&#xff0c;想實現系統盤冗余&#xff0c;各位大佬可以給點建議嗎。 Deep Seek 為了實現兩塊硬盤作為 Ubuntu 24 系統盤的冗余配置&#xff08;RAID 1&#xff09;&#xff0c;確保一塊硬盤損壞時系統仍可運行&#xff0c;以下是詳細步驟&am…