Head First設計模式 觀察者模式

2021-10-11 16:40:42 字數 3147 閱讀 7146

設計模式的**倉庫:

設計模式

目的:定義物件之間的一對多依賴關係,這樣當乙個物件改變狀態時,所有的依賴物件都會得到通知並自動更新

在某些情況下,觀察者依賴乙個以上的主體可能是有意義的。例如,乙個電子**可能依賴於多個資料來源。在這種情況下,有必要擴充套件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 公有繼承...