Java 設計模式 觀察者(Observer)

2021-08-09 08:19:19 字數 1876 閱讀 6022

需求:建立 internet 氣象觀察站。該氣象站建立在 weatherdata 物件上,由 weatherdata 物件負責追蹤目前的天氣狀況,而我們需要建立乙個應用,有 3 個佈告板,分別顯示目前的狀況,氣象統計以及簡單的預報。當 weatherdata 物件獲得最新的測量資料時,三種佈告板必須實時更新。

weatherdata 原始檔

public

class weatherdata

一旦氣象測量更新,measurementschanged 就會被呼叫。

觀察者模式定義觀察者模式提供了一種物件設計,讓主題和觀察者之間松耦合

關於觀察者的一切,主題只知道觀察者實現了某個介面 (observer介面),主題不需要知道觀察者的具體類是誰,做了些什麼或其他任何細節。任何時候我們都可以增加新的觀察者,因為主題唯一依賴的東西是乙個實現了 observer 介面的物件列表,所以我們可以隨時增加觀察者。事實上,在執行時我們可以用新的觀察者取代現有的觀察者,主題不會受到任何影響。同樣的,也可以在任何時候刪除某些觀察者。

在新型別的觀察者出現時,主題的**不需要修改。假如我們有個新的具體類需要當觀察者,我們不需要為了相容新型別而修改主題的**,所有要做的就是子啊新的型別裡實現此觀察者的介面,然後註冊為觀察者即可。主題不在乎別的,它只會傳送通知給所有實現了觀察者介面的物件。

抽象主題角色類

public

inte***ce

subject

具體實現類

public

class

weatherdata

implements

subject

@override

public

void

registerobserver(observer o)

@override

public

void

removeobserver(observer o)

}@override

public

void

notifyobservers()

}public

void

measurementschanged()

}

抽象觀察者角色類

/**

* 所有的觀察者都必須實現 update 方法,以實現 observer 介面。

*/public

inte***ce

observer

觀察者實現類

/**

* 此公告板實現了observer 介面,所以可以從 subject 物件獲得改變

*/public

class

currentconditiondisplay

implements

observer

@override

public

void

update(float temp, float humidity, float pressure)

}

測試程式

public

class weatherstation

}

客戶端首先建立了具體主題類的例項,以及乙個觀察者物件,在觀察者物件建構函式中,想主題註冊成為觀察者,這樣當主題資料發生改變時,就能實時獲取資料。

客戶端呼叫主題的 setmeasurements() 方法,改變了主題物件的內部狀態。主題物件在狀態發生變化時,呼叫超類的notifyobservers()方法,通知所有登記過的觀察者物件。

java設計模式 觀察者模式

本例以貓和老鼠來講解觀察者,首先定義觀察者為 老鼠和主人,被觀察者為貓,如下 public inte ce observer public class event public string getname public class mouse implements observer public ...

Java設計模式 觀察者模式

在物件之間定義一對多的依賴關係,這樣一來,當乙個物件改變狀態,依賴它的物件都會收到通知,並自動更新。比如有乙個天氣的資料來源,和需要獲取天氣資料的觀察者。天氣資料不定時更新。而觀察者也是隨時訂閱和取消訂閱天氣資料來源。在訂閱時,希望每次天氣資料更新時觀察者都可以獲取資訊。天氣資料來源作為被觀察的主題...

Java設計模式 觀察者模式

觀察者模式是乙個使用率非常高的的模式,它是一套訂閱 發布系統,這個模式最重要的作用就是將訂閱者和被訂閱者解耦。定義物件間一種對多種的依賴關係,使得每當乙個物件改變狀態,則所有依賴於它的物件都會得到通知。subject 抽象主題類,也就是被觀察者 observable 把所有觀察者物件儲存在乙個集合裡...