觀察者模式(訂閱模式)

2021-09-18 08:03:18 字數 2110 閱讀 9657

定義物件間一種一對多的關係,使得每當乙個物件改變狀態,則所有依賴他的物件都會得到通知並被自動更新。

使用場景

1、某些時候需要一些物件有所關聯,而且這種關聯是可以拆分而不是組合在一起的。

2、某一事件發生,需要向多方觸發。

3、訊息交換,如訊息佇列、事件匯流排的處理機制。

1、subject:抽象主題,被觀察者(observable)的抽象,管理著眾多觀察者的實現,可以實現新增或刪除觀察者的功能。

2、concretesubject:具體主題,被觀察者(observable)的實現,通過該實現來向觀察者傳送通知。

3、observer:抽象觀察者(observer),觀察者的抽象。一般是介面,實現該介面生成各種各樣的觀察者。

4、concreteobserver:具體觀察者,抽象觀察者的具體實現,當被觀察者發生變化時執行具體邏輯。

要實現的功能:定義乙個資料訂閱源,當資料來源發生變化時,訂閱者收到訊息。

/**

* 觀察者模式(訂閱模式)

*/public class observabledesigndemo

}/**

* 被觀察者具體實現

*/class observableimp extends observable

}/**

* 觀察者具體實現

jdk自帶類observable

public class observable 

// 2.1 新增觀察者物件

public synchronized void addobserver(observer o)

}// 2.2 刪除觀察者物件

public synchronized void deleteobserver(observer o)

// 3.1 通知所有觀察者

public void notifyobservers()

public void notifyobservers(object arg)

// 遍歷所有觀察者並呼叫其 update 方法

for (int i = arrlocal.length-1; i>=0; i--)

((observer)arrlocal[i]).update(this, arg);

}// 刪除所有觀察者物件

public synchronized void deleteobservers()

// 設定標記為 true,表明資料發生了變化且已經通知過

protected synchronized void setchanged()

// 清除標記,恢復預設狀態

protected synchronized void clearchanged()

// 獲取標記

public synchronized boolean haschanged()

// 獲取觀察者的數量

public synchronized int countobservers()

}

可以看到所有訂閱了資料訂閱源的人都收到了訊息,observable和observer是jdk中內建的類,可見觀察者模式是非常重要的,這裡observer是抽象的觀察者角色,observerimp扮演的是具體的觀察者角色;observable扮演的是抽象的主題(被觀察者)角色,observableimp代表的是具體的主題角色,當observableimp有更新時會遍歷通知所有的觀察者,然後給這些觀察者傳送乙個訊息,即observerimp的update()方法,這樣達到了一對多的通知功能,在這個過程中,通知系統都是依賴observer和observable,因此對於observerimp和observableimp完全沒有耦合,保證了訂閱系統的靈活性、可擴充套件性。

訂閱者模式(觀察者模式)

include include include struct notification virtual void process 0 class subscribera public notification class subscriberb public notification class p...

觀察者模式和訂閱者模式

1 要有個存放訂閱的事件佇列 2 通過on去訂閱事件 3 emit去觸發事件 const fs require fs node的自帶模組 const path require path const resolve file console.log resolve age.txt let evento...

觀察者模式(發布訂閱模式)

簡介 觀察者模式 又被稱為發布 訂閱 public subscribe 模式,屬於行為型模式的一種,它定義了一種一對多的依賴關係,讓多個觀察者物件同時監聽某乙個主題物件。這個主題物件再狀態變化時,會通知所有的觀察者物件,使他們能夠自動更新自己。塊 public 發布動態 button 觀察者 粉絲 ...