C 設計模式之觀察者模式

2022-10-04 04:06:08 字數 2261 閱讀 5873

前言

之前做了乙個效能測試的專案,就是需要對現在的產品進行效能測試,獲得測試資料,然後書寫測試報告,並提出合理化的改善意見。專案很簡單,我們獲得了一系列效能測試資料,對於資料,我們需要在excel中製作測試資料的折線圖、餅狀圖和柱狀圖,以直觀的表現出效能的變化。在實際操作時,我發現,如果我修改了乙個資料,折線圖、餅狀圖和柱狀圖就都發生了變換。這個是如何做到的?這就要說到今天總結的觀察者模式了,作為設計模式大家庭中最重要的乙個,我們不得不去好好的學習一下觀察者模式。

觀察者模式

在gof的《設計模式:可復用物件導向軟體的基礎》一書中對觀察者模式是這樣說的:定義物件間的一種一對多的依賴關係,當乙個物件的狀態發生改變時,所有依賴於它的物件都得到通知並被自動更新。當乙個物件發生了變化,關注它的物件就會得到通知;這種互動也稱為發布-訂閱(publish-subscribe)。目標是通知程式設計客棧的發布者,它發出通知時並不需要知道誰是它的觀察者。

再說說上面的資料和圖之間的關係;不管是折線圖、餅狀圖,還是柱狀圖,它們都依賴於資料;當資料發生變化時,資料物件會通知依賴於它的物件去更新;所以就有了excel中,當資料發生變化時,對應的統計圖也會自動的重繪。

uml類圖

subject(目標)

——目標知道它的觀察者。可以有任意多個觀察者觀察同乙個目標;

——提供註冊和刪除觀察者物件的介面。

observer(觀察者)

——為那些在目標發生改變時需獲得通知的物件定義乙個更新介面。

concretesubject(具體目標)

——將有關狀態存入各concreteobserver物件;

——當它的狀態發生改變時,向它的各個觀察者發出通知。

concreteobserver(具體觀察者)

——維護乙個指向concretesubject物件的引用;

——儲存有關狀態,這些狀態應與目標的狀態保持一致;

——實現observer的更新介面以使自身狀態與目標的狀態保持一致。

觀察者模式按照以下方式進行協作:

1.當concretesubject發生任何可能導致其觀察者與其本身狀態不一致的改變時,它將通知它的各個觀察者;

2.在得到乙個具體目標的改變通知後,concreteobserver物件可向目標物件查詢資訊。concreteobserver使用這些資訊以使它的狀態與目標物件的狀態一致。

以下是呼叫時序圖:

使用場合

在以下任一情況下都可以使用觀察者模式:

1.當乙個抽象模型有兩個方面,其中乙個方面依賴於另一方面。將這二者封裝在獨立的物件中以使它們可以各自獨立的改變和復用;

2.當對乙個物件的改變需要同時改變其它物件,而不知道具體有多少物件有待改變;

3.當乙個物件必須通知其它物件,而它又不能假定其它物件是誰;也就是說,你不希望這些物件是緊密耦合的。

**實現

複製** **如下:

#include

#include

using namespace std;

class observer; 

class subject; 

class concreteobserver : public observer

void update(int value)

private:

subject *m_psubject;}; 

class concreteobserver2 : public observer

void update(int value)

private:

subject *m_psubject;}; 

class concretesubject : public subject

private:

std::listgnhgujher *> m_observerlist;

int m_istate;}; 

void concretesubject::attach(observer *pobserver)

void concretesubject::detach(observer *pobserver)

void concretesubject::notify()} 

int main()

總結觀察者模式在23個設計模式中的地位是非常高的,我們基本上各大框架中都是隨處可見。真正的理解了程式設計客棧整個模式,對我們去理解別人的**有非常大的幫助;在我們日後的工作中也會或多或少的使用該設計模式。這裡總結的不是很全面,在日後如果碰到了需要補充的內容,我會繼續補充的;同時也希望大家提出更好的建議。

本文標題: c++設計模式之觀察者模式

本文位址:

c 設計模式之觀察者模式

觀察者模式 observer 定義 觀察者模式定義了一種一對多的依賴關係,讓多個觀察者物件同時監聽某乙個主題物件。這個主題物件在狀態上發生變化時,會通知所有觀察者物件,讓它們能夠自動更新自己。觀察者模式類結構圖 觀察者模式的角色 subject抽象主題角色 把所有對觀察者物件的引用儲存在乙個集合中,...

c 設計模式之觀察者模式

觀察者模式定義了物件間的一對多依賴關係,當乙個物件的狀態發生改變時,所有依賴於它的物件都會得到通知並自動更新.觀察者與被觀察者之間使用松耦合方式結合 主題是真正擁有資料的人,觀察者是主題的依賴者,在資料變化時更新,比許多物件控制同乙份資料更乾淨 class observer 觀察者介面 class ...

C 設計模式之觀察者模式

觀察者設計模式定義了物件間的一對多的依賴關係,乙個物件的行為依賴於另乙個物件的狀態的情況下,當物件狀態發生變化時,依賴它的物件會得到通知並自動重新整理。觀察者模式中主要有兩種角色 觀察者和監聽者 觀察者主要是在事件到來時,通知對於該事件感興趣的監聽者來處理事件。所以它的職責也就顯而易見了 通知觀察者...