定義了物件之間的一對多依賴,當乙個物件改變狀態時,它的所有依賴者都將會收到通知並自動更新.觀察者模式形容圖
有乙個氣象觀察站,我們希望建立乙個應用,有三種佈告板(用於顯示不同的氣象資料),當氣象站獲取到最新的測量資料時,我們希望三種佈告板能實時更新.
類圖設計
其中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 公有繼承...