觀察者模式

2021-09-29 01:58:07 字數 2626 閱讀 3634

觀察者模式是物件之間多對一的一種設計方案,定義了物件之間一對多的依賴,被依賴的物件為subject,依賴的物件為observer。這樣一來,當乙個物件改變狀態時,它的所有依賴者都會收到通知並自動更新,即subject通知observer變化。

觀察者模式類似於訂牛奶業務:1)奶站/氣象局:subject;2)使用者/第三方**:observer

subject:登記註冊、移除和通知

說明:1)registerobserver():註冊

2)removeobserver():移除

3)notifyobservers():通知所有註冊的使用者,根據不同需求,可以是更新資料,讓使用者來取,也可能是實時推送,看具體需求

observer:接收輸入

天氣預報專案需求,具體要求如下:1)氣象站可以將每天測量到的溫度、濕度、氣壓等等,以公告的形式發布出去(比如發布到自己的**或第三方);2)需要設計開放型api,便於其他第三方也能介入氣象站獲取資料;3)提供溫度、濕度和氣壓的介面;4)測量資料更新時,要能實時通知給第三方。

第一種設計方案:普通方案

通過對氣象站專案的分析,我們可以初步設計出乙個weatherdata類:

說明:1)通過get***方法,可以讓第三方介入,並得到相關資訊

2)當資料有更新時,氣象站通過呼叫datachange()去更新資料,當第三方再次獲取時,就能得到最新資料,當前也可以推送

對於這種方案的實現,有兩個問題:1)其他第三方接入氣象站獲取資料的問題;2)無法在執行時動態的新增第三方,在weatherdata中,當增加乙個第三方,都需要建立乙個對應的第三方的公告板物件,並加入到datachange,不利於維護,也不是動態加入;3)違反了開閉原則

第二種設計方案:使用觀察者模式

類圖如下所示:

**如下所示:

建立subject介面及其子類:

//介面,讓weatherdata來實現

public inte***ce subject

/**

* 該類是核心

* 包含最新的天氣情況;含有觀察者集合,使用arraylist管理;

* 當資料有更新時,就主動呼叫arraylist,這樣他們(接收者)就看到最新的訊息

**/public class weatherdata implements subject

public float gettemperatrue()

public float getpressure()

public float gethumidity()

public void datachange()

public void setdata(float temperatrue, float pressure, float humidity)

public void registerobserver(observer o)

public void removeobserver(observer o)

}//遍歷所有觀察者

public void notifyobservers()}}

建立observer介面及其子類:

//觀察者介面,由觀察者來實現

public inte***ce observer

//顯示當前天氣情況(可以理解成是自己的**)

public class currentcondition implements observer

private void display()

}

//顯示當前天氣情況(可以理解成是自己的**)

}

建立client類:

public class client

}

jdk的obserable類使用了觀察者模式。

角色分析:

1)observable的作用和地位等價於我們前面講過的subject

2)observable是類,不是介面。類中已經實現了核心的方法,即管理observer的方法

3)observer的作用和地位等價於我們前面講過的observer,有update方法

4)observable和observe的使用方法和前面講過的一樣,只是observable是類,通過繼承來實現觀察者模式

python觀察者模式 python 觀察者模式

python 觀察者模式 前言e 寫的倉促就不截uml類圖了,書本chapter10,p313能看到圖 一旦觀察的主題有更新,就會通知到觀察者們,下面的例子是最簡單的乙個觀察者範例,假設這是一群投機分子密切關注 軍 火 倉庫的產品與數量變動 class inventory def init self...

觀察者模式

觀察者模式 observer 完美的將觀察者和被觀察的物件分離開。舉個例子,使用者介面可以作為乙個觀察者,業務資料是被觀察者,使用者介面觀察業務資料的變化,發現資料變化後,就顯示在介面上。物件導向設計的乙個原則是 系統中的每個類將重點放在某乙個功能上,而不是其他方面。乙個物件只做一件事情,並且將他做...

觀察者模式

觀察者模式定義了一種一對多的依賴關係,讓多個觀察者物件同時監聽某乙個主題物件。這個主題物件在狀態上發生變化時,會通知所有觀察者物件,讓他們能夠自動更新自己 任何乙個模式都是離不開角色的,這裡也會有幾種角色 抽象主題角色 把所有對觀察者物件的引用儲存在乙個集合中,每個抽象主題角色都可以有任意數量的觀察...