設計模式學習筆記之觀察者模式

来源:http://www.cnblogs.com/LeslieXia/archive/2016/05/15/5494800.html
-Advertisement-
Play Games

觀察者模式 定義了對象之間的一對多依賴,這樣一來,當一個對象狀態改變時,它的所有依賴者都會收到通知並自動更新。 觀察者模式中,分為推和拉兩種模式。 推模式,即主題對象向觀察者對象推送狀態值,不管觀察者對象是否需要,並且推送全部數據或者部分數據。 拉模式,即主題對象通知觀察者對象狀態值已改變,觀察者根 ...


觀察者模式     定義了對象之間的一對多依賴,這樣一來,當一個對象狀態改變時,它的所有依賴者都會收到通知並自動更新。     觀察者模式中,分為兩種模式。     模式,即主題對象向觀察者對象推送狀態值,不管觀察者對象是否需要,並且推送全部數據或者部分數據。     模式,即主題對象通知觀察者對象狀態值已改變,觀察者根據自己需要決定是否主動到主體對象中獲取詳細信息。     兩種模式的比較

    1、推模型是假定主題對象知道觀察者需要的數據;而拉模型是主題對象不知道觀察者具體需要什麼數據,沒有辦法的情況下,乾脆把自身傳遞給觀察者,讓觀察者自己去按需要取值。

    2、推模型可能會使得觀察者對象難以復用,因為觀察者的update()方法是按需要定義的參數,可能無法兼顧沒有考慮到的使用情況。這就意味著出現新情況的時候,就可能提供新的update()方法,或者是乾脆重新實現觀察者;而拉模型就不會造成這樣的情況,因為拉模型下,update()方法的參數是主題對象本身,這基本上是主題對象能傳遞的最大數據集合了,基本上可以適應各種情況的需要。

      說明:     1、觀察者模式將觀察者和主題(被觀察者)的對象分離開,實現了兩者的松耦合。提高了應用程式的可維護性和重用性;     2、JAVA API 內置有觀察者模式。位於java.util包,包含有最基本的Observer介面與Observable類,分別對應觀察者和主題;     3、主題僅需要把實時的狀態值更新給觀察者即可,而不需要知道觀察者怎樣處理數據或者其他細節。       場景:     1、對於一個對象的狀態值需要實時更新到其他任何幾個對象。如氣象站檢測的天氣數據,要實時更新給氣象網站的佈告板。
/**  * 主題類介面。  * 用來定義註冊觀察者、移除觀察者、通知更新等方法  * @author xiabaike  */ public interface Subject {       /**      * 註冊觀察者      * */     public void registerObserver(Observer o);       /**      * 移除觀察者      * */     public void removeObserver(Observer o);       /**      * 當狀態改變時,調用此方法,通知所有觀察者      * */     public void notifyObservers(); }
/**  * 觀察者類介面。  * 當主題狀態發生改變時,主題會把這些狀態值當做方法的參數,傳送給觀察者。  * @author xiabaike  * */ public interface Observer {       /**      * 當主題狀態發生改變時,主題會把這些狀態值當做方法的參數,傳送給觀察者      * 所有觀察者都必須實現此方法,以實現觀察者介面      * */     public void  update(float temp, float humidity, float pressure);   }
/**  * 展示。在佈告板上顯示內容   * */ public interface DisplayElement {       /**      * 當佈告板需要顯示時,調用此方法      * */     public void display();   }
/**  * 天氣數據類。產生更新狀態值,並通知佈告板觀察者  * */ public class WeatherData implements Subject{       // 用來存放所有的觀察者     private List<Observer> observerList;       private float tempPerature;     private float humidity;     private float pressure;       public WeatherData() {         observerList = new ArrayList<Observer>();     }       public void registerObserver(Observer o) {         observerList.add(o);     }       public void removeObserver(Observer o) {         if(observerList.contains(o)) {             observerList.remove(o);         }     }       public void notifyObservers() {         for(int i = 0; i < observerList.size(); i++) {             observerList.get(i).update(tempPerature, humidity, pressure);         }     }       /**      * 當從氣象站得到更新觀測值時,通知觀察者      * */     public void setMeasurements(float temperature, float humidity, float pressure) {         this.tempPerature = temperature;         this.humidity = humidity;         this.pressure = pressure;         notifyObservers();     } }
/**  * 具體佈告板實現類。獲取狀態值,並展示  * */ public class CurrentConditionsDisplay implements Observer, DisplayElement{       private float tempPerature;     private float humidity;     private float pressure;     private Subject subject;       public CurrentConditionsDisplay(Subject subject) {         this.subject = subject;         this.subject.registerObserver(this);     }       public void update(float temp, float humidity, float pressure) {         this.tempPerature = temp;         this.humidity = humidity;         this.pressure = pressure;         display();     }       public void display() {         System.out.println("Current conditions: " + tempPerature +", "+ humidity +", "+ pressure);     } }
/**  * 主類,模擬氣象站產生檢測數據,並更新給佈告板  * */ public class WeatherStation {       public static void main(String[] args) {         WeatherData subject = new WeatherData();         CurrentConditionsDisplay observer = new CurrentConditionsDisplay(subject);         subject.setMeasurements(1, 2, 3);     } }
    參考資料:《Head First 設計模式》                    http://www.cnblogs.com/itTeacher/archive/2012/12/03/2800129.html                    http://www.cnblogs.com/java-my-life/archive/2012/05/16/2502279.html
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 前段時間因為“某度競價排名”的事情鬧得沸沸揚揚的,因為某度搜出來的內容的質量實在是不敢恭維,所以早就戒掉了某度改用Google了。但是Google早就被牆了呢,所以翻牆才能訪問Google呢,這個“翻牆”的過程就是一個代理的過程。“代理模式”在之前的博客中不止一次的提及過,之前的委托回調就是代理模式 ...
  • 一、簡介Dubbo是Alibaba開源的分散式服務框架,它最 大的特點是按照分層的方式來架構,使用這種方式可以使各個層之間解耦合(或者最大限度地 松耦合)。從服務模型的角度來看,Dubbo採用的是一種非常簡單的模型,要麼是提供方提供服務,要麼是消費方消費服務,所以基於這一點可以抽象出服務提 供方(P ...
  • 觀察者模式:在對象之間定義一對多的依賴,這樣一來,當一個對象改變狀態,依賴它的對象都會收到通知,並自動更新。 舉個例子:氣象監測應用 此系統的三個部分是氣象站(獲取實際氣象數據的物理裝置)、WeatherData對象(追蹤來自氣象站的數據,並更新佈告板)和佈告板(有三個佈告板,一個用來顯示目前天氣狀 ...
  • 新博客 "wossoneri.com" " 設計模式系列目錄 " 需求情景 比如現在需要做一個收銀軟體,要根據用戶所買商品的單價和數量進行計算。 很簡單,用“單價 數量”即可。 但如果某天需要打折呢? 也很簡單,同一個方法,把折扣作為一個參數,預設值為1,代碼改為“單價 數量 折扣”即可。 恩,看起 ...
  • 概述 有時候你可能會在條件判斷中,根據不同的對象類型(通常是基類的一系列子類,或介面的一系列實現),提供相應的邏輯和演算法。當出現大量類型檢查和判斷時,if else(或switch)語句的體積會比較臃腫,這無疑降低了代碼的可讀性。另外,if else(或switch)本身就是一個“變化點”,當需要擴... ...
  • 生成器模式 封裝一個產品的構造過程,並允許按步驟構造。 將一個複雜對象的構建與表示分離,使同樣的構造過程可以創建不同的表示。 生成器模式結構中的四種角色: 產品(Product): 所要構建的複雜對象。 抽象生成器(Builder): 抽象生成器是一個介面,該介面除了為創建一個Product對象的各 ...
  • 適配器模式 適配器模式 將一個類的介面轉換成客戶期望的另一個介面,適配器讓原本介面不相容的類可以合作無間。 通過創建適配器進行介面轉換,讓不相容的介面變成相容。這可以讓客戶從實現的介面解耦。如果在一段時間後,想要改變介面,適配器可以將改變的部分封裝起來,客戶就不必為了應對不同的介面 而每次跟著修改。 ...
  • 狀態模式 允許對象在內部狀態改變時改變它的行為,對象看起來好像修改了它的類。 狀態模式所涉及到的角色有: 環境(Context)角色,也成上下文:定義客戶端所感興趣的介面,並且保留一個具體狀態類的實例。這個具體狀態類的實例給出此環境對象的現有狀態。 抽象狀態(State)角色:定義一個介面,用以封裝 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...