設計模式演化之觀察者模式1 經典實現

2021-10-05 12:53:04 字數 2540 閱讀 6205

定義

定義一種物件之間的一對多關係,當乙個物件狀態改變時,所有依賴於它的物件都得到訊息,並重新整理。

演化1.定義subject和observer兩個類,現在要求當subject物件中的乙個屬性改變時,observer物件要把這個屬性實時顯示出來。在**中我們可以這麼寫:讓subject物件持有observer物件的引用,當屬性改變時,呼叫observer的update()方法。

(1) 定義subject類

public

class

subject

public

void

setname

(string name)

}}

(2) 定義observer類

public

class

observer

}

(3) 呼叫過程

public

class

observeclient

}

從**呼叫過程上講,observer在**中是被呼叫者,而subject是主動呼叫者。但從實際意義上講,我們已經實現了乙個觀察者模式的基礎:在observer中觀察subject中name屬性的變化,當name變化時通知observer進行更新。總結起來就是被觀察者需要持有觀察者的引用,當改變資料時呼叫觀察者的更新方法。下面我們基於這一點對這這段**進行優化。

2.首先,我們已經明確了1中的過程已經滿足了觀察者模式的條件。為了讓**能更準確的表達含義,我們對方法名做出一定的修改。

(1) 將subject中的setobserver()改為registerobserver(),表示給subject註冊觀察者。setname()改為changename(),表示name是變化的屬性。

public

class

subject

public

void

changename

(string name)

}}

(2) 將observer中的update()改為onchange()。從字面意義上理解,update()看上去只是乙個需要被呼叫的方法。而onchange()卻表達了當屬性變化時執行的意思。雖然它們的本質上都是被呼叫,但我們卻能通過onchange()方法名來增強它觀察者的身份。

public

class

observer

}

3.現在我們新增乙個要求,有很多個類的物件都需要觀察name屬性的變化,而且變化後各自執行不同的操作。此時就需要把observer抽象成乙個介面,讓需要觀察name變化的類都實現observer介面。然後把它們都註冊到subject中去。

(1) 定義observer抽象介面

public

inte***ce

observer

(2) 定義observer的實現類

public

class

firstobserver

implements

observer

}

public

class

secondobserver

implements

observer

}

(3) 給subject增加乙個list,使它可以持有很多的觀察者。當資料變化時,通知所有觀察者,即呼叫所有觀察則的onchange()方法。

public

class

subject

public

void

changename

(string name)

}}

(4) 在客戶端中呼叫的**如下。

public

class

observeclient

}

4.此時還存在乙個問題:這麼多觀察者物件都要觀察subject中的資料,subject的生命週期一定相當的長,而且需要比所有的觀察者物件都長。但是它又持有所有觀察者的引用,這就導致了及時觀察者物件已經無用了,記憶體也無法釋放。因此還要提供給觀察者解除註冊的方法,當觀察者物件不需要使用時,呼叫解除方法釋放引用。

public

class

subject

}

經過四個步驟的演化,經典的觀察模式已經完成了。但實際上這種經典的模式我們還是很少在**中用到的,正如定義中提到的那樣,只能滿足多個觀察者觀察乙個資料的變化。

優點:(1)觀察者和被觀察者抽象耦合

(2)建立一套觸發機制,建立之後不需要改變**邏輯

缺點(1)如果觀察者較多,通知所有的觀察者要花費很多時間,因此在觀察者不可用的時候,要及時取消註冊

(2)如果觀察者與被觀察者迴圈依賴,可能導致迴圈呼叫,導致系統崩潰

(3)觀察者不知道所觀察的物件是怎麼變化的,只知道變化

經典設計模式之觀察者模式

在物件之間定義了一對多的依賴,這樣一來,當乙個物件改變狀態,依賴它的物件會收到通知並自動更新。其實就是發布訂閱模式,發布者發布資訊,訂閱者獲取資訊,訂閱了就能收到資訊,沒訂閱就收不到資訊。zookeeper事件通知節點 訊息訂閱通知 安卓開發事件註冊 分布式配置中心等等 抽象被觀察者角色 也就是乙個...

設計模式之觀察者模式

首先說了乙個自己的小例子吧,前兩天我的乙個朋友來找我玩,因為路途比較遠,我需要知道他的位置,然後安排好時間去接他,那麼在這個例子中,我就是乙個觀察者,需要時時刻刻觀察他的位置,我的朋友就是乙個被觀察者。那麼需要知道我朋友的位置,就有兩種方式,第一,我自己打 問,第二,我的朋友告訴我,下面我們來看看這...

設計模式之觀察者模式

一 作用 讓多個觀察者監視某一物件的變化,如果物件變化,則通知所有觀察者。二 例子 抽象主題類 public abstract class subject 移除觀察者 public void detach observer observer 向觀察者 們 發出通知 public void notif...