設計模式的**倉庫:
設計模式
目的:定義物件之間的一對多依賴關係,這樣當乙個物件改變狀態時,所有的依賴物件都會得到通知並自動更新
在某些情況下,觀察者依賴乙個以上的主體可能是有意義的。例如,乙個電子**可能依賴於多個資料來源。在這種情況下,有必要擴充套件update介面,讓觀察者知道是哪個主題在傳送通知。在update操作中,主體可以簡單地將自己作為引數傳遞,從而讓觀察者知道要檢查哪個主體。
主體和它的觀察者依靠通知機制來保持一致。但實際上是什麼物件呼叫notify來觸發更新呢?這裡有兩種選擇。
讓subject上的狀態設定操作在改變主體的狀態後呼叫notify。這種方法的優點是,客戶端不必記得對subject呼叫notify。
缺點是連續幾次操作會導致連續幾次更新,效率可能會很低。
讓客戶端負責在合適的時間呼叫notify。這裡的優點是客戶端可以等到一系列狀態變化之後再觸發更新,從而避免了不必要的中間更新。缺點是,客戶端要承擔額外的責任來觸發更新。
這使得出錯的可能性更大,因為客戶端可能會忘記呼叫 通知:
在乙個極端,我們稱之為推模式,主體向觀察者傳送關於變化的詳細資訊,無論他們是否想要。另乙個極端是拉動模式;主體只傳送最基本的通知,而觀察者則在此後明確詢問細節
拉模式強調主體對觀察者的無知,而推模式則假設主體對觀察者的需求有所了解。推模式可能會使觀察者的可重用性降低,因為主體類對觀察者類做出的假設可能並不總是真實的。另一方面,pull模型可能效率低下,因為observer類必須在沒有subject幫助的情況下確定發生了什麼變化。
您可以通過擴充套件主體的註冊介面,允許只為感興趣的特定事件註冊觀察員,從而提高更新效率。當這樣的事件發生時,主體只通知那些對該事件感興趣的觀察者。支援這種方式的一種方法是為主體物件使用方面的概念。
封裝用組合替代繼承
面向介面程式設計
模式優點:符合「開閉原則」——觀察者的增加和刪除,主題的增加和刪除
實現表示層和資料邏輯層分離
支援廣播通訊
缺點:將所有觀察者通知會花費很多時間
若觀察者與目標產生迴圈依賴的話,可能導致系統崩潰
沒有相應機制讓觀察者知道目標是怎麼變化的,只是知道目標發生變化了而已
觀察者模式拓展到 mvc 模式 當 model 改變時,view 自動改變顯示內容
觀察目標——model
觀察者——view
中介者——controller
public
abstract
class
observer
public
class
binaryobserver
extends
observer
@override
public
void
update()
}
public
class
hexaobserver
extends
observer
@override
public
void
update()
}
public
class
subject
public
void
setstate
(int state)
public
void
attach
(observer observer)
public
void
notifyallobservers()
}}
public
class
octalobserver
extends
observer
@override
public
void
update()
}
public
class
observerpatterndemo
}
public
inte***ce
displayelement
/**
* 觀察者,實現了觀察者介面
*/public
class
currentconditiondisplay
implements
observer
, displayelement
@override
public
void
update
(observable o, object arg)
@override
public
void
display()
@override
public string tostring()
}
public
class
weatherdata
extends
observable
public
void
setmeasurements
(float temperature,
float humidity,
float pressure)
//測量值發生改變時
private
void
measurementschanged()
public
float
gettemperature()
public
float
gethumidity()
public
float
getpressure()
}
Head First 設計模式2 觀察者模式
1,觀察者模式定義了物件之間一對多的關係 2,主題 也就是可觀察者 用乙個共同的介面來更新觀察者 3,觀察者和可觀察者之間用鬆耦合方式結合,可觀察者不知道觀察者細節,只知道觀察者實現了觀察者介面 4,使用此模式你可以從被觀察者處 推 或者 拉 資料,推 的方式被認為更正確 5,有多個觀察者時,不可以...
Head First設計模式之觀察者模式
氣象站採集的資料用於三個公告板進行展示,請設計這樣的系統,完成我們想要的功能 當氣象資料發生變化時,立即通知三個公告板更新資料。我們這裡的氣象站就是發布者,三個公告板就是訂閱者。1.設計乙個氣象站類,裡面儲存各種氣象資料。2.設計不同的公告板用於顯示資料,設計統一的資料更新方法,用於更新資料顯示。3...
HeadFirst設計模式之觀察者模式學習
pragma once include include include using namespace std 觀察者類的定義 class suscriber 出版者類的定義 主題 class publisher class ytouchsubsciber public suscriber 公有繼承...