DP-觀察者模式代碼詳解

觀察者模式: 定義一系列對象之間的一對多關系;當一個對象改變狀態,它的依賴都會被通知。 主要由主題(Subject)和觀察者(Observer)組成。

代碼實現

package com.designpatterns.observer;/*** 定義主題接口*/
public interface Subject {void registerObserver(Observer o);void removeObserver(Observer o);void notifyObservers();
}
/*** 定義觀察者接口*/
public interface Observer {public void update(float temp,float humidity,float pressure);//當主題狀態變更時,被調用
}
package com.designpatterns.observer;/*** 定義天氣情況顯示的元素接口*/
public interface DisplayElement {public void display();
}
package com.designpatterns.observer;import java.util.ArrayList;
import java.util.List;/*** 具體主題的實現*/
public class WeatherDataConcretSubject implements  Subject{private List<Observer> observers;private float temperature;private  float humidity;private float pressure;public WeatherDataConcretSubject(){observers=new ArrayList<>();}@Overridepublic void registerObserver(Observer o) {observers.add(o);}@Overridepublic void removeObserver(Observer o) {observers.remove(o);}@Overridepublic void notifyObservers() {for (Observer observer : observers) {observer.update(temperature,humidity,pressure);  //觀察者更新天氣數據}}public void measurementsChanged(){notifyObservers();//當測量到新的天氣數據,通知觀察者}/*** 設置天氣測試數據* @param temperature* @param humidity* @param pressure*/public void setMeasurements(float temperature,float humidity,float pressure){this.temperature=temperature;this.humidity=humidity;this.pressure=pressure;measurementsChanged();}}

package com.designpatterns.observer;/**** 具體每個觀察者實現。每個觀察著注冊具體主題以接口更新*** 顯示當前的天氣情況***/
public class CurrentConditionsDisplay implements Observer, DisplayElement{private float temperature;private float humidity;private WeatherDataConcretSubject weatherDataConcretSubject;public CurrentConditionsDisplay(WeatherDataConcretSubject weatherDataConcretSubject){this.weatherDataConcretSubject=weatherDataConcretSubject;weatherDataConcretSubject.registerObserver(this);}@Overridepublic void update(float temp, float humidity, float pressure) {this.temperature=temp;this.humidity=humidity;display();}@Overridepublic void display() {System.out.println("Current conditions:"+temperature+"F degrees and "+ humidity+"% humidity ");}
}
package com.designpatterns.observer;public class ForecastDisplay implements  Observer,DisplayElement{private float temperature;private float humidity;private WeatherDataConcretSubject weatherDataConcretSubject;public ForecastDisplay(WeatherDataConcretSubject weatherDataConcretSubject){this.weatherDataConcretSubject=weatherDataConcretSubject;weatherDataConcretSubject.registerObserver(this);}@Overridepublic void display() {//顯示預報的天氣System.out.println("ForecastDisplay:"+temperature+"F degrees and "+ humidity+"% humidity ");}@Overridepublic void update(float temp, float humidity, float pressure) {this.temperature=temp;this.humidity=humidity;display();}
}
package com.designpatterns.observer;public class StatisticsDisplay implements Observer,DisplayElement{private float temperature;private float humidity;private WeatherDataConcretSubject weatherDataConcretSubject;public StatisticsDisplay(WeatherDataConcretSubject weatherDataConcretSubject){this.weatherDataConcretSubject=weatherDataConcretSubject;weatherDataConcretSubject.registerObserver(this);}@Overridepublic void update(float temp, float humidity, float pressure) {this.temperature=temp;this.humidity=humidity;display();}@Overridepublic void display() {//顯示測量的avg,min,max值System.out.println("StatisticsDisplay:"+temperature+"F degrees and "+ humidity+"% humidity ");}
}
package com.designpatterns.observer;/*** 觀察者模式測試*/
public class WeatherStationTest {public static void main(String[] args) {WeatherDataConcretSubject weatherDataConcretSubject=new WeatherDataConcretSubject();CurrentConditionsDisplay currentConditionsDisplay=new CurrentConditionsDisplay(weatherDataConcretSubject);StatisticsDisplay statisticsDisplay=new StatisticsDisplay(weatherDataConcretSubject);ForecastDisplay forecastDisplay=new ForecastDisplay(weatherDataConcretSubject);//設置模擬的氣象數據weatherDataConcretSubject.setMeasurements(80,65,30.4f);weatherDataConcretSubject.setMeasurements(82,70,29.2f);weatherDataConcretSubject.setMeasurements(78,90,29.2f);}
}

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

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

相關文章

1983:ARPANET向互聯網的轉變

一、ARPANET早期1969年誕生的ARPANET最初還算不上互聯網&#xff0c;不過在ARPANET構建之初就已經考慮了分組交換&#xff1a;1970年代的ARPANET:其實這個時候我就有疑問&#xff0c;TCP/IP是1983年1月1日更新到ARPANET的&#xff0c;但是1970年代的ARPANET已經連接全美的重要單…

自動化運維-ansible中的變量運用

自動化運維-ansible中的變量運用 一、變量命名規則 組成&#xff1a;字母、數字、下劃線。必須以字母開頭。 合法: app_port, web_1, varA非法: 2_var (以數字開頭), my-var (包含其他字符), _private (以下劃線開頭) 避免使用內置關鍵字&#xff1a;例如 hosts, tasks, name…

深入學習并發編程中的volatile

volatile 的作用 保證變量的內存可見性禁止指令重排序1.保證此變量對所有的線程的可見性&#xff0c;當一個線程修改了這個變量的值&#xff0c;volatile 保證了新值能立即同步到主內存&#xff0c;其它線程每次使用前立即從主內存刷新。 但普通變量做不到這點&#xff0c;普通…

使用Java獲取本地PDF文件并解析數據

獲取本地文件夾下的PDF文件要獲取本地文件夾下的PDF文件&#xff0c;可以使用Java的File類和FilenameFilter接口。以下是一個示例代碼片段&#xff1a;import java.io.File; import java.io.FilenameFilter;public class PDFFileFinder {public static void main(String[] args…

吳恩達機器學習補充:決策樹和隨機森林

數據集&#xff1a;通過網盤分享的文件&#xff1a;sonar-all-data.csv 鏈接: https://pan.baidu.com/s/1D3vbcnd6j424iAwssYzDeQ?pwd12gr 提取碼: 12gr 學習來源&#xff1a;https://github.com/cabin-w/MLBeginnerHub 文末有完整代碼&#xff0c;由于這里的代碼和之前的按…

Shell腳本一鍵監控平臺到期時間并釘釘告警推送指定人

1. 監控需求客戶側有很多平臺需要定期授權&#xff0c;授權后管理后臺才可正常登錄&#xff0c;為避免授權到期&#xff0c;現撰寫腳本自動化監控平臺授權到期時間&#xff0c;在到期前15天釘釘或其他媒介提醒。2. 監控方案2.1 收集平臺信息梳理需要監控的平臺地址信息&#xf…

華為HCIE數通含金量所剩無幾?考試難度加大?

最近網上很火的一個梗——法拉利老了還是法拉利&#xff0c;這句話套在華為HCIE數通身上同樣適用&#xff0c;華為認證中的華為數通和云計算兩大巨頭充斥著大家的視野里面&#xff0c;也更加廣為人知&#xff0c;但隨著時代的發展&#xff0c;華為認證體系的調整&#xff0c;大…

#數據結構----2.1線性表

在數據結構的學習中&#xff0c;線性表是最基礎、最核心的結構之一 —— 它是后續棧、隊列、鏈表等復雜結構的 “基石”。今天從 “是什么”&#xff08;定義&#xff09;到 “怎么用”&#xff08;基本操作&#xff09;&#xff0c;徹底搞懂線性表的核心邏輯。 一、先明確&…

2508C++,skia動畫

gif動畫原理 先了解一下gif動畫的原理: gif動畫由一系列靜態圖像(或叫幀)組成.這些圖像按特定的順序排列,每一幀都代表動畫中的一個瞬間,幀圖像是支持透明的. 每兩幀之間有指定的時間間隔(一般小于60毫秒),gif播放器每渲染一幀靜態圖像后,即等待此時間間隔,依此邏輯不斷循環渲染…

AI + 機器人:當大語言模型賦予機械 “思考能力”,未來工廠將迎來怎樣變革?

一、引言1.1 未來工廠變革背景與趨勢在科技飛速發展的當下&#xff0c;全球制造業正站在變革的十字路口。隨著消費者需求日益多樣化、市場競爭愈發激烈&#xff0c;傳統工廠模式的弊端逐漸顯現。生產效率低下、難以適應個性化定制需求、設備維護成本高昂且缺乏前瞻性等問題&…

pinia狀態管理的作用和意義

1. 什么是狀態管理 狀態管理就是統一管理應用中的數據&#xff0c;讓數據在多個組件之間共享和同步。 // 沒有狀態管理 - 數據分散在各個組件中 // 組件A const user ref({ name: 張三, age: 25 })// 組件B const user ref({ name: 張三, age: 25 }) // 重復定義// 組件C c…

十四、STM32-----低功耗

一、電源框圖VDDA 供電區域&#xff0c;主要是 ADC 電源以及參考電壓&#xff0c;STM32 的 ADC 模塊配備獨立的供電方 式&#xff0c;使用了 VDDA 引腳作為輸入&#xff0c;使用 VSSA 引腳作為獨立地連接&#xff0c;VREF 引腳為提供給 ADC 的 參考電壓。電壓調節器是 STM32 的…

一篇文章帶你徹底搞懂 JVM 垃圾收集器

垃圾收集器是 JVM 內存管理的執行引擎&#xff0c;負責自動回收無用的對象內存。其設計核心是 權衡&#xff1a;主要是吞吐量和停頓時間之間的權衡。沒有“最好”的收集器&#xff0c;只有“最適合”特定場景的收集器。一、核心基礎&#xff1a;分代收集模型主流 HotSpot JVM 采…

服務器排故隨筆:服務器無法ssh遠程登錄

文章目錄服務器排故隨筆&#xff1a;服務器無法遠程登錄問題現象解決過程第一步&#xff1a;確認故障描述是否準確第二步&#xff1a;確認網絡是否有問題第三步&#xff1a;確認ssh服務是否有問題第四步&#xff1a;確認防火墻是否放行sshd服務第五步&#xff1a;試試萬能的“重…

Deeplizard深度學習課程(六)—— 結合Tensorboard進行結果分析

前言 Tensorboard最初是tensorflow的可視化工具&#xff0c;被用于機器學習實驗的可視化&#xff0c;后來也適配了pytorch。Tensorboard是一個前端web界面&#xff0c;&#xff0c;能夠從文件里面讀取數據并展示它&#xff08;比如損失、準確率、網絡圖&#xff09;。具體使用可…

C語言————實戰項目“掃雷游戲”(完整代碼)

無論是找工作面試&#xff0c;還是課設大作業、考研&#xff0c;都離不開實戰項目的積累&#xff0c;如果你能把一個項目搞明白&#xff0c;并且給別人熟練的講出來&#xff0c;即使你沒有過項目經歷&#xff0c;也可以說是非常加分的&#xff0c;下面來沉浸式體驗一下這款掃雷…

數據結構之加餐篇 -順序表和鏈表加餐

目錄一、鏈表分割二、隨機鏈表的復制總結一、鏈表分割 鏈表分割 題目描述的意思就如下圖&#xff1a; 也就是把1&#xff0c;2挪到前面&#xff0c;6&#xff0c;3&#xff0c;5挪到后面&#xff0c;前者的相對順序不發生改變 這里要想往后挪就要先遍歷&#xff0c;遍歷到6…

JSP與Servlet整合數據庫開發:構建Java Web應用的全棧指南

JSP與Servlet整合數據庫開發&#xff1a;構建Java Web應用的全棧指南 概述 在Java Web開發領域&#xff0c;JSP&#xff08;JavaServer Pages&#xff09;與Servlet是構建動態Web應用的核心技術組合。Servlet作為Java EE的基礎組件&#xff0c;負責處理客戶端請求、執行業務邏…

設計五種算法精確的身份證號匹配

問題定義與數據準備 我們有兩個Excel文件&#xff1a; small.xlsx: 包含約5,000條記錄。large.xlsx: 包含約140,000條記錄。 目標&#xff1a;快速、高效地從large.xlsx中找出所有其“身份證號”字段存在于small.xlsx“身份證號”字段中的記錄&#xff0c;并將這些匹配的記錄保…

Spring 框架(IoC、AOP、Spring Boot) 的必會知識點匯總

目錄&#xff1a;&#x1f9e0; 一、Spring 框架概述1. Spring 的核心功能2. Spring 模塊化結構&#x1f9e9; 二、IoC&#xff08;控制反轉&#xff09;核心知識點1. IoC 的核心思想2. Bean 的定義與管理3. IoC 容器的核心接口4. Spring Bean 的創建方式&#x1f9f1; 三、AOP…