HEAD FIRST 之觀察者模式

2021-09-11 12:56:35 字數 3124 閱讀 6104

定義了物件之間的一對多依賴,當乙個物件改變狀態時,它的所有依賴者都將會收到通知並自動更新.

觀察者模式形容圖

有乙個氣象觀察站,我們希望建立乙個應用,有三種佈告板(用於顯示不同的氣象資料),當氣象站獲取到最新的測量資料時,我們希望三種佈告板能實時更新.

類圖設計

其中weatherdata用於獲取氣象站最新測量資料(三個get方法),當資料更新時,會呼叫onchanged方法(不要管為什麼,這是氣象站內部邏輯).

**實現

主題介面

inte***ce

sublect

複製**

主題物件weatherdata

class

weatherdata

implements

sublect

}public

function

removeobserver

() }

public

function

nitifyobservers

() }

public

function

onchanged

() //獲取最新氣壓

public

function

getpressure

() //獲取最新溫度

public

function

gettemperature

() //獲取最新濕度

public

function

gethumidity

() //測試

public

function

youneedchanged()}

複製**

觀察者介面

inte***ce

observer

複製**

顯示面板介面

inte***ce

displayelement

複製**

觀察者物件集

class

currentconditionsdisplay

implements

observer, displayelement

public

function

update

($pressure, $temperature, $humidity)

public

function

display

(), current temperature: ";

}}//其他兩種佈告板省略

複製**

測試

$weatherdata = new weatherdata();

$display = new currentconditionsdisplay($weatherdata);//把當前布告欄註冊成為觀察者

//$other = new othersdisplay($weatherdata);//把當前布告欄註冊成為觀察者

//$other = new otherdisplay($weatherdata);//把當前布告欄註冊成為觀察者

$weatherdata->youneedchanged();//氣象站資料更新了會導致佈告板實時更新

//current pressure: 33, current temperature: 46

複製**

我們知道,觀察者總是被動的接受主題物件的推送,但有些場景下,我們希望觀察者能主動的去獲取資料;畢竟觀察者數量這麼多,主題物件不可能事先知道每個觀察者需要的狀態,並且也不會導致明明只需要一點點資料,卻被迫收到一堆.

我們來重寫設計上面的問題.

類圖基本保持不變,只是在weatherdata類新增了setchanged方法並改變了observer介面update簽名.

重構後的主題介面

inte***ce

sublect

inte***ce

observer

複製**

重構後的主題物件

class

weatherdata

implements

sublect

$this->changed = false;}}

public

function

onchanged

() public

function

setchanged

()//新增方法

//其他方法保持不變

}複製**

重構後的佈告板物件

class

currentconditionsdisplay

implements

observer, displayelement

public

function

update

(sublect $subject, $object = null)

$this->display();

}public

function

display

(), current temperature: ";

}}複製**

為什麼要加乙個setchanged方法

setchanged讓你在更新觀察者時,有更多的彈性,能更適當的通知觀察者,比方說,如果沒有setcanged方法,氣象站溫度變化十分之一度時,都會通知所有觀察者,你肯定不想讓這麼頻繁的更新吧.我們可以控制溫度變化達到一度時,呼叫setchanged,進行有效的更新.

Head First設計模式之觀察者模式

氣象站採集的資料用於三個公告板進行展示,請設計這樣的系統,完成我們想要的功能 當氣象資料發生變化時,立即通知三個公告板更新資料。我們這裡的氣象站就是發布者,三個公告板就是訂閱者。1.設計乙個氣象站類,裡面儲存各種氣象資料。2.設計不同的公告板用於顯示資料,設計統一的資料更新方法,用於更新資料顯示。3...

Head First設計模式 觀察者模式

設計模式的 倉庫 設計模式 目的 定義物件之間的一對多依賴關係,這樣當乙個物件改變狀態時,所有的依賴物件都會得到通知並自動更新 在某些情況下,觀察者依賴乙個以上的主體可能是有意義的。例如,乙個電子 可能依賴於多個資料來源。在這種情況下,有必要擴充套件update介面,讓觀察者知道是哪個主題在傳送通知...

HeadFirst設計模式之觀察者模式學習

pragma once include include include using namespace std 觀察者類的定義 class suscriber 出版者類的定義 主題 class publisher class ytouchsubsciber public suscriber 公有繼承...