Java設計模式 二 觀察者模式

2021-09-05 11:44:09 字數 2258 閱讀 2961

小馬公司與氣象站合作乙個專案,氣象站擁有一些氣象的資料(weatherdata),這些資料通過一定的演算法可以算出明天的天氣,現在需要做兩個佈告板板分別來展示今天的天氣和明天的天氣。氣象站的需求不是很明確,小馬目前知道的資訊如下:

1.weatherdata類具有getter方法,可以獲得溫度,濕度兩個資料(假設這兩個資料可以推算出今天和明天的天氣)

2,當新資料準備妥當時monmentchangeed()方法就會被呼叫.(不需要知道知道如何被呼叫)

3.小馬需要實現兩個兩個佈告板:今天的天氣和明天的天氣

4.此系統必須可擴充套件,讓開發人員建立定製的佈告板,使用者可以隨性所欲地建立佈告板。

小馬不負眾望,馬上寫了乙個錯誤示範:

public class weatherdata

}

這麼做有什麼問題:

1.面對實現程式設計而非面對介面程式設計;

2.佈告板沒有實現同乙個介面;

3.對於每個新的佈告板,我們都得修改**;

4.侵犯了weatherdata類的封裝,每次新增乙個佈告板都得修改weatherdata;

5.我們無法在執行時動態地增加佈告板.

首先我們想一想報紙和雜誌的訂閱:

報社的業務就是出版報紙

當使用者向報社訂閱報紙後,每當報社有新的報紙出版,那麼就會送發給你。

當使用者不想再訂閱時,取消訂閱後,報社將不會再向你送發報紙。

只要報社還在,就可以一直向其訂閱報紙。

那麼結合小馬的業務場景。weatherdata就類似於報社,佈告板就類似於訂閱報紙的人,在這樣的模式中,weatherdate我們稱其為主題(subject),佈告板我們稱其為觀察者(observer)。對於主題weatherdata,應該有註冊、資料更新時提醒觀察者的方法。那麼我們將這三個方法抽出為乙個介面subject,又weatherdata實現;對於觀察者佈告板,應該有更新自身資料的方法update()和展示自身資料的方法display(),這兩個方法抽出為乙個介面observer,**如下:

//主題介面

public inte***ce isubject

//觀察者介面

public inte***ce iobserver

有了介面後下面來完成具體的weathdata和佈告板的實現:

public class weatherdata implements subject 

//移除觀察者

@override

public void removeoberver(observer observer)

}//提醒觀察者更新資料

@override

public void noyifyoberver()

}//此方法呼叫代表weatherdata已經準好

public void monmentchange()

public float getwendu()

public void setwendu(float wendu)

public float getshidu()

public void setshidu(float shidu)

}

根據業務,目前有兩塊佈告板tommordisplay和todaydisply作為觀察者,這兩個類都實現iobserver,看**吧:

/**

* 今日天氣佈告板

*/public class todaydisply implments iobserver

@override

public void update(float wendu, float shidu)

public void display()

}

/**

* 明日天氣預報

*/public class tommordisplay implements observer

@override

public void update(float wendu, float shidu)

public void display()

}

public static void main(string args)
結果:

今天的天氣1.0

明天的天氣23.0

今天的天氣23.841702

明天的天氣48.58134

java設計模式 觀察者模式

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

Java設計模式 觀察者模式

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

Java設計模式 觀察者模式

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