設計模式 觀察者模式(行為) 發布訂閱模式

2022-07-20 05:15:13 字數 1432 閱讀 9251

兩個物件之間存在一種關係:當乙個物件的狀態變化時,另乙個類的狀態應該做出相應的變化。

乙個物件變化需要通知另乙個物件,輪詢是不可能的,只能是顯式的通知,也就是說乙個物件在狀態變化的時候顯式的通知另乙個物件。顯式通知的意思是 呼叫另乙個物件的乙個方法。

// 前置宣告

class abchanger;

// 主動觀察者基類

// 他會被動的接到通知。

class abstaff

;// 具體的不同種類的觀察者,對收到的訊息做出相應

class staff1 :public abstaff

;class staff1 :public abstaff

;// 被觀察的物件,當自己狀態改變的時候需要通知觀察了自己的物件

class abchanger

private:

vectorlist;

};class changer1:public abchanger

;

感覺觀察者模式,改名為通知模式更為貼切,因為是當乙個類狀態改變的時候,自己主動去通知別人。

觀察者模式,觀察者與被觀察者之間強耦合。

而訂閱發布模式在進行解耦,中間新增乙個centor

發布者(被觀察者)當狀態改變的時候向centor發布訊息(發布者呼叫函式,然後將centor,和訊息傳入函式,函式內部又會將訊息**給centor)。centor的函式又會遍歷、通知所有訂閱了該訊息的觀察者(呼叫其函式)。

// 前置宣告

class abcentor; // 訊息中心:收到publisher,發來的訊息就遍歷abstaff呼叫其update

class publisher; // 發布訊息,呼叫 abcentor 的publish

class abstaff; // 訂閱到 abcentor,由 abcentor 呼叫自己的update

// 主動觀察者基類

// 他會被動的接到通知。

class abstaff

;// 具體的不同種類的觀察者,對收到的訊息做出相應

class staff1 : public abstaff

;class staff1 : public abstaff

;// 被觀察的物件,當自己狀態改變的時候需要通知觀察了自己的物件

class abcentor

private:

vectorlist;

};class centor1 : public abcentor

;// publisher 也可能存在繼承

class publisher

}

本質上沒有區別,只是發布訂閱模式,將發布者和訂閱者解耦了。

另外,真的這種模式叫做通知模式更好,因為是觀察者並沒有觀察觀察者,而是被觀察者顯式的通知了觀察者。

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

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

觀察者模式 訂閱發布模式

觀察者模式是一種物件間的一對多依賴關係,當乙個物件的狀態發生變化時,所有依賴他的物件都將得到通知。通常運用在物件之間的訊息通訊中。比如現在有一群學生,可以組成小組,可以尋求幫助 class students askforhelp subject 向大家尋求幫助 this.tasks.foreach ...

設計模式 觀察者和發布訂閱模式

最近在學習設計模式,本文就同乙個例子對觀察者和發布訂閱進行 觀察者模式 比較概念的解釋是,目標和觀察者是基類,目標提供維護觀察者的一系列方法,觀察者提供更新介面。具體觀察者和具體目標繼承各自的基類,然後具體觀察者把自己註冊到具體目標裡,在具體目標發生變化時候,排程觀察者的更新方法。舉個例子 比如有個...