定義物件間一種一對多的關係,使得每當乙個物件改變狀態,則所有依賴他的物件都會得到通知並被自動更新。
使用場景
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 觀察者 粉絲 ...