設計模式使用場景實現示例及優缺點(行為型模式——觀察者模式)

阿爾法的身體內部有一個智能芯片,這個芯片能夠根據環境和需求自動改變它的行為模式。當阿爾法需要完成不同任務時,它的內部狀態會發生變化,進而改變它的行為,就像是它變成了另一個機器人一樣。

一天,智能城的市長接到一個緊急消息:城市的能源核心出了問題,導致整個城市即將陷入黑暗。市長知道只有阿爾法才能解決這個問題,于是他立刻派人去找阿爾法。

阿爾法接到任務后,立即進入“修理模式”。在修理模式下,阿爾法的內部狀態變為“工程師狀態”,它的手臂變成了各種工具,眼睛變成了高精度的掃描儀。阿爾法迅速來到了能源核心,開始檢測問題所在。

經過一番檢查,阿爾法發現問題出在能源核心的控制系統上。它決定進入“編程模式”。在編程模式下,阿爾法的內部狀態變為“程序員狀態”,它的手指變成了鍵盤和電纜接口,能夠直接連接到控制系統并進行編程。

阿爾法快速編寫了一段修復程序,上傳到控制系統中。隨著程序的運行,能源核心漸漸恢復了正常,整個智能城重新亮起了光芒。

然而,阿爾法的任務并沒有結束。智能城的一所學校發生了火災,學生們被困在教學樓里。阿爾法接到新的任務后,立即進入“救援模式”。在救援模式下,阿爾法的內部狀態變為“救援狀態”,它的身體變得更加堅固,裝備了各種救援工具和滅火設備。

阿爾法迅速趕到現場,使用滅火器撲滅了火焰,隨后用強有力的臂膀破開被困學生們的教室門,將他們一個個安全地帶了出來。

觀察者模式(Observer Pattern)

狀態模式(State Pattern)是一種行為設計模式,它允許一個對象在其內部狀態改變時改變它的行為。這種模式通過將狀態相關的行為封裝在狀態對象中,使得當對象的內部狀態改變時,其行為也會隨之改變,類似于它改變了其類。

核心組件

  • Subject(主題):主題保存了一組觀察者,提供用于增加或刪除觀察者的接口。
  • Observer(觀察者):為那些在主題狀態改變時需要獲得通知的對象定義一個更新接口。
  • ConcreteSubject(具體主題):存儲具體觀察者關心的數據,發送通知給觀察者,通常包含對具體數據的增刪改操作。
  • ConcreteObserver(具體觀察者):實現觀察者接口,以便在得到通知時更新自身。

適用場景

  1. 當一個抽象模型有兩個方面,其中一個方面依賴于另一個方面時
    • 觀察者模式允許你獨立地擴展或復用核心功能。
  2. 當對一個對象的改變需要同時改變其他對象,而不知道具體有多少對象需要改變時
    • 觀察者模式可以讓你在不修改這些類的前提下增加新的觀察者。
  3. 當一個對象必須通知其他對象,但你希望避免做成這些對象之間的緊密耦合時
    • 觀察者模式提供了一種松耦合的設計解決方案。

實現實例

以新聞應用為例,其中新聞發布系統(主題)需要通知所有訂閱者(觀察者)新聞更新。

主題接口(Subject Interface)

定義了附加和刪除觀察者的方法,以及通知觀察者的方法。

public interface Subject {void registerObserver(Observer o);void removeObserver(Observer o);void notifyObservers();
}

具體主題(Concrete Subject)

存儲狀態,并在狀態改變時通知觀察者。

public class NewsAgency implements Subject {private List<Observer> observers = new ArrayList<>();private String news;public void registerObserver(Observer o) {observers.add(o);}public void removeObserver(Observer o) {observers.remove(o);}public void notifyObservers() {for (Observer observer : observers) {observer.update(news);}}public void setNews(String news) {this.news = news;notifyObservers();}
}

觀察者接口(Observer Interface)

定義更新接口,用于獲取狀態改變通知。

public interface Observer {void update(String news);
}

具體觀察者(Concrete Observer)

實現觀察者接口,根據通知更新自己。

public class NewsChannel implements Observer {private String news;@Overridepublic void update(String news) {this.news = news;System.out.println("News Updated: " + news);}
}

客戶端代碼(Client Code)

演示如何使用觀察者模式。

public class Client {public static void main(String[] args) {NewsAgency newsAgency = new NewsAgency();NewsChannel channel = new NewsChannel();newsAgency.registerObserver(channel);newsAgency.setNews("New update on AI technology!");}
}

優缺點

優點
  1. 支持廣播通信
    • 觀察者模式提供了一種訂閱機制,可以實現消息的廣播。
  2. 應用松耦合
    • 主題與觀察者之間使用抽象耦合,可以輕松地添加新的觀察者。
缺點
  1. 可能引發無序的更新
    • 如果觀察者的更新方法引發循環依賴,可能導致系統行為難以預測。
  2. 當觀察者和主題之間的依賴關系復雜時,可能需要額外的維護成本

類圖

+----------------+         +------------------+
|   Subject      |-------->|   Observer       |
+----------------+         +------------------+
| + registerObserver()     | + update()       |
| + removeObserver()       |                  |
| + notifyObservers()      +------------------+
+----------------+         |
|                |         |
+----------------+         ||+-------------------+--------+----------------+|                   |                 |                |
+---------------+ +-----------------+ +----------------+ +--------------+
|ConcreteSubject| |ConcreteObserver1| |ConcreteObserver2| | ...          |
+---------------+ +-----------------+ +----------------+ +--------------+
| + setNews()   | | + update()       | | + update()      | | + update()   |
+---------------+ +-----------------+ +----------------+ +--------------+

總結

觀察者模式提供了一種優雅的方式來實現對象間的通信,特別適用于狀態變化需要通知多個對象的場景。通過將主題與觀察者解耦,增加了系統的靈活性和可擴展性,同時也需注意避免循環依賴和更新順序問題。

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

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

相關文章

多種方式實現 元素高度絲滑的從0-1顯示出來

選擇合適的方式&#xff0c;給用戶更好的體驗&#xff0c;多種方式實現 元素高度絲滑的從0-1顯示出來。 能用 CSS 實現的動畫&#xff0c;就不要采用 JS 去實現。 1、瀏覽器可以對CSS動畫進行優化&#xff0c;其優化原理類似于requestAnimationFrame&#xff0c;會把每一幀的…

java基礎學習:序列化之 - Fast serialization

在Java中&#xff0c;序列化是將對象的狀態轉換為字節流的過程&#xff0c;以便保存到文件、數據庫或通過網絡傳輸。Java標準庫提供了java.io.Serializable接口和相應的機制來進行序列化和反序列化。然而&#xff0c;標準的Java序列化機制性能較低&#xff0c;并且生成的字節流…

appium2.0 執行腳本遇到的問題

遇到的問題&#xff1a; appium 上的日志信息&#xff1a; 配置信息 方法一 之前用1.0的時候 地址默認加的 /wd/hub 在appium2.0上&#xff0c; 服務器默認路徑是 / 如果要用/wd/hub 需要通過啟動服務時設置基本路徑 appium --base-path/wd/hub 這樣就能正常執行了 方法二…

關于Kafka的17個問題

1.Kafka 的設計時什么樣的呢&#xff1f; Kafka 將消息以 topic 為單位進行歸納 將向 Kafka topic 發布消息的程序成為 producers. 將預訂 topics 并消費消息的程序成為 consumer. Kafka 以集群的方式運行&#xff0c;可以由一個或多個服務組成&#xff0c;每個服務叫做一個…

前端css常用筆記

文章目錄 一、樣式二、vue筆記2.1、組件之間的通信2.1.1 子組件調用父組件的方法2.1.2 父組件調用子組件的方法2.1.3 孫組件調用祖父組件方法的實現 2.2、使用若依時,node_nodules越來越大的問題2.3、echart筆記 一、樣式 1 文字與圖標對不齊的解決方法 /**給icon加上這個樣式即…

mysql的索引事務和存儲引擎

一、索引 1、索引 索引的概念 &#xff1a;索引是一個排序的列表&#xff0c;在列表當中存儲索引的值以及索引值對應數據所在的物理行。 索引的引用&#xff1a; 使用索引之后&#xff0c;就不需要掃描全表來定位某行的數據。 加快數據庫的查詢速度。 索引可以是表中的一…

ubuntu 網絡 通訊學習筆記2

1.ubuntu 網絡常用命令 在Ubuntu中&#xff0c;有許多網絡相關的常用命令。以下是一些主要命令及其用途&#xff1a; ifconfig&#xff1a;此命令用于顯示和配置網絡接口信息。你可以使用它來查看IP地址、子網掩碼、廣播地址等。 例如&#xff1a;ifconfig 注意&#xff1a…

在 K8s 上使用 KubeBlocks 提供的 MySQL operator 部署高可用 WordPress 站點

引言 WordPress WordPress 是全球最流行的內容管理系統&#xff08;CMS&#xff09;&#xff0c;自 2003 年發布以來&#xff0c;已成為網站建設的首選工具。其廣泛的插件和主題生態系統使用戶能夠輕松擴展功能和美化外觀。活躍的社區提供豐富的資源和支持&#xff0c;進一步…

[RK3588-Android12] 關于如何取消usb-typec的pd充電功能

問題描述 RK3588取消usb-typec的pd充電功能 解決方案&#xff1a; 在dts中fusb302節點下usb_con: connector子節點下添加如下熟悉&#xff1a; 打上如下2個補丁 diff --git a/drivers/usb/typec/tcpm/tcpm.c b/drivers/usb/typec/tcpm/tcpm.c index c8a4e57c9f9b..173f8cb7…

使用OpenCV尋找圖像中的輪廓

引言 OpenCV&#xff08;Open Source Computer Vision Library&#xff09;是一個開源的計算機視覺和機器學習軟件庫。它提供了大量的視覺處理功能&#xff0c;包括圖像和視頻捕獲、特征檢測與匹配、圖像變換、圖像分割、顏色空間轉換等。在圖像處理中&#xff0c;尋找圖像中的…

electron項目中實現視頻下載保存到本地

第一種方式&#xff1a;用戶自定義選擇下載地址位置 渲染進程 // 渲染進程// 引入 import { ipcRenderer } from "electron";// 列表行數據下載視頻操作&#xff0c;diffVideoUrl 是視頻請求地址 handleDownloadClick(row) {if (!row.diffVideoUrl) {this.$message…

【數字電路學習新助手】掌握電路仿真軟件,開啟數字電路知識的新篇章

在信息科技日新月異的今天&#xff0c;數字電路知識的重要性不言而喻。無論是通信工程、計算機科學與技術&#xff0c;還是電子信息技術等領域&#xff0c;數字電路都是基礎中的基礎。然而&#xff0c;對于初學者來說&#xff0c;數字電路的學習往往充滿了挑戰。幸運的是&#…

Axure中繼器入門:打造你的動態原型

前言 中繼器 是 Axure 中的一個高級功能&#xff0c;它能夠在靜態頁面上模擬后臺數據交互的操作&#xff0c;如增加、刪除、修改和查詢數據&#xff0c;盡管它不具備真實數據存儲能力。 中繼器就像是一個臨時的數據庫&#xff0c;為我們在設計原型時提供動態數據管理的體驗&a…

中職省培丨2024年大數據技術中職教師專業技能培訓班企業參觀實踐圓滿結束

7月17日&#xff0c;“2024年大數據技術中職教師專業技能培訓班&#xff08;省培&#xff09;”參訓老師蒞臨廣東泰迪智能科技股份有限公司產教融合實訓中心開展企業參觀實踐。泰迪智能科技董事長張良均、中職業務部總監李振林、中職業務部經理黃炳德、校企合作經理吳桂鋒及來自…

centos跳過首次創建用戶

centos跳過首次創建用戶 centos跳過首次創建用戶 在安裝系統后&#xff0c;登錄的時候總是讓新建一個普通用戶&#xff0c;很是煩人&#xff0c;于是想辦法解決一下 方法一 在CentOS上&#xff0c;圖形化登錄&#xff08;如GNOME&#xff09;通常要求您創建一個用戶來登錄。…

.net core appsettings.json 配置 http 無法訪問

1、在appsettings.json中配置"urls": "http://0.0.0.0:8188" 2、但是網頁無法打開 3、解決辦法&#xff0c;在Program.cs增加下列語句 app.UseAntiforgery();

vue 如何做一個動態的 BreadCrumb 組件,el-breadcrumb ElementUI

vue 如何做一個動態的 BreadCrumb 組件 el-breadcrumb ElementUI 一、ElementUI 中的 BreadCrumb 定義 elementUI 中的 Breadcrumb 組件是這樣定義的 <template><el-breadcrumb separator"/"><el-breadcrumb-item :to"{ path: / }">主…

爬蟲的概念

爬蟲&#xff08;Web Crawler 或 Web Spider&#xff09;是一種自動化腳本或程序&#xff0c;用于瀏覽萬維網&#xff08;World Wide Web&#xff09;并抓取網頁上的信息。它們按照設定的規則自動地訪問互聯網上的網頁&#xff0c;提取所需的數據&#xff0c;如文本、圖片、視頻…

搭建七日殺服務端系統選擇,系統如何選擇

《七日殺》是一款集合了第一人稱射擊、恐怖生存、塔防與角色扮演要素于一身的開放世界僵尸游戲。玩家需要在美國亞歷桑納地區作為幸存者生存&#xff0c;并探究整個事件背后的真相。對于喜歡這款游戲的玩家來說&#xff0c;搭建自己的專屬服務器不僅能降低延遲&#xff0c;還能…

精通Python數據可視化:Matplotlib柱狀圖、直方圖與餅狀圖實戰解析

精通Python數據可視化&#xff1a;Matplotlib柱狀圖、直方圖與餅狀圖實戰解析 引言 在數據分析和科學研究中&#xff0c;數據可視化扮演著至關重要的角色。Matplotlib是Python中一個廣泛使用的繪圖庫&#xff0c;它提供了豐富的繪圖功能和靈活的定制選項。本文將詳細介紹如何…