設計模式之觀察者模式

2021-08-22 18:06:57 字數 2483 閱讀 7137

觀察者模式的定義是:

觀察者模式(有時又被稱為模型-檢視(view)模式、源-收聽者(listener)模式或從屬者模式)是軟體設計模式的一種。在此種模式中,乙個目標物件管理所有相依於它的觀察者物件,並且在它本身的狀態改變時主動發出通知。這通常透過呼叫各觀察者所提供的方法來實現。此種模式通常被用來實現事件處理系統。

大概就是說在這個模式中有兩種身份,乙個是被觀察的目標,另乙個就是觀察者,最簡單的觀察者模式就是觀察者對目標有乙份監聽,當目標某些屬性發生變化產生訊號時,觀察者能夠知道並隨之產生相應相關的變化。這種模式就像是收音機,被觀察的目標就是電台,觀察者就是收聽的人,當電台收到新的資訊之後會發出廣播訊號,收聽者就能收到對應的訊號並從中獲取資訊,並可以根據獲取到的資訊決定自己是否要作出反應,這就是最原始的觀察者模式。

**示例為:執行環境為vs2015

// 觀察者練習.cpp : 定義控制台應用程式的入口點。

//#include "stdafx.h"

#include #include using namespace std;

class observer

; observer::observer()

observer::~ observer()

class listener : observer

; void listener::outputstate()

listener::listener(int state)

listener::~listener()

void listener::updata(int state)

class subject

;subject::subject()

subject::~subject()

class announcer : public subject

int m_state;

private:

listm_obslist;

};announcer::announcer()

announcer::~announcer()

void announcer::attach(listener* lis)

void announcer::detach(listener* lis)

void announcer::notify()

return;

}int main()

執行結果為:

這就是最基礎的觀察者模式。

上面的基礎版的觀察者模式主要是應用在簡單的一對多的關係中,但是實際開發中還會有多對

一、多對多等情況出現,這時我們可以通過對觀察者模式進行公升級來實現。之前的觀察者模式中被監視的目標需要在自己發生變化後通知所有在自己這裡註冊了的觀察者,這可能是乙份很繁重的工作,所以我們可以為目標(subject)新增乙個助手來對自己的觀察者(observer)進行管理,這個助手我們將它命名為manager。這個manager就會取代 subject 的位置,observer 們不再與 subject 有直接的聯絡,而是將自己的身份註冊在manager上。也就是將上面例子中的 announcer 中的 關於 listener 的列表被轉移至了新增加的manager類中,而manager再將自己註冊到announcer 上,當 announcer 產生了可能會改變 listener 的訊號,就將這個訊號傳送至manager 上,manager再將訊號進行解析處理並通知對應的 listener 進行處理。

新增這個manager的好處是可以用來解決多對多或是「不完全「」的一對多的關係的情況。多對多的情況下,manager 可以通過自己所接收到的目標的訊號來決定將訊號傳送給哪些監聽者;「不完全「的一對多就是目標所產生的訊號可能只對部分監聽者有影響,就像你所收聽到的天氣廣播只會是你所在的地區相關,並不一定對外地人有效,這時這個 manager 可以記錄哪些是與目標所發出的訊息對應的「本地人」,而不再需要像基礎的觀察者模式中那樣目標不管這個訊號是否對監聽者有影響,只會將訊號傳送給自己所擁有id的監聽者。這種新增了 manager 後監聽者模式使得目標中不必再儲存很多的監聽者名單,只要保留乙個或幾個 manager 就可以,能夠降低一些耦合度。

可能有人會覺得這個 manager 有沒有都一樣,監聽者的名單註冊在目標中也可以,只不過決定將訊號**給哪些監聽者是由目標自己進行處理。確實是這樣,這些對訊號的處理放在目標中也是一樣的,甚至這樣可能開發時編寫的**會更少,但是如果目標是乙個及其大的類,裡面很多功能很多監聽者,那麼這些訊號處理放在目標類中就會讓目標類變得更難維護,新增了乙個 manager 可以使**更加有條理,所以我還是覺得在監聽者很多同時訊號也有多種處理時新增乙個 manager 是不錯的選擇。

這個高階的觀察者模式**相比於上面的示例只是多了乙個 manager 類,有人看到這裡還感興趣的話可以自己去寫一下。。。

觀察者模式作為開發中用的最多的設計模式之一還有很多值得研究的點,到現在我也只是初學,以後再對觀察者模式有了進一步的思考再繼續來更這一篇~~~

設計模式之觀察者模式

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

設計模式之觀察者模式

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

設計模式之觀察者模式

觀察者模式的定義是 定義物件間的一種一對多的依賴關係。當乙個物件的狀態發生變化時,所有依賴它的物件都會得到通知並自動更新 報社跟讀者的例子 我們用報社和讀者之間的關係來模擬觀察者模式。包含以下主體 報社 news office 讀者介面 reader 具體讀者 reader 二逼青年 reader ...