觀察者模式 Publish Subscribe

2021-07-11 19:05:47 字數 2901 閱讀 7565

實現 c

使用情景

觀察者(observer)模式又名發布-訂閱(publish/subscribe)模式。gof 給觀察者模式如下定義:

定義物件間的一種一對多的依賴關係,當乙個物件的狀態發生改變時,所有依 賴於它的物件都得到通知並被自動更新。

物件導向設計的乙個重要原則——單一職責原則。系統的每個物件應該 將重點放在問題域中的離散抽象上。因此理想的情況下,乙個物件只做一件事情。這樣在開發中也就帶來了諸多的好處: 提供了重用性和維護性,也是進行重構的良好的基礎。

因此幾乎所有的設計模式都是基於這個基本的設計原則來的。

其中:

- 抽象目標角色(subject): 目標角色知道它的觀察者,可以有任意多個觀察者觀察同乙個目標。並且提供註冊和刪除觀察者物件的介面。目標角色往往由抽象類或者介面來實現。

- 抽象觀察者角色(observer): 為那些在目標發生改變時需要獲得通知的物件定義乙個更新介面. 抽象觀察者角色主要由抽象類或者介面來實現。

- 具體目標角色(concrete subject): 將有關狀態存入各個 concrete observer 物件。當它的狀態發生改變時, 向它的各個觀察者發出通知。

- 具體觀察者角色(concrete observer): 儲存有關狀態,這些狀態應與目標的狀態保持一致。實現 observer 的更新介面以使自身狀態與目標的狀態保持一致。在本角色內也可以維護乙個指向 concrete subject 物件的引用。

// observer.hpp

#ifndef observer_hpp

#define observer_hpp

#include

#include "log.hpp"

#include "subject.hpp"

class subject;

class observer ;

std::string state;

virtual

void update(subject& subject);

};class observer1 : public observer

void update(subject& subject);

};class observer2 : public observer

void update(subject& subject);

};#endif /* observer_hpp */

// observer.cpp

#include

"observer.hpp"

void observer::update(subject& subject)

void observer1::update(subject& subject)

void observer2::update(subject& subject)

// subject.hpp

#ifndef subject_hpp

#define subject_hpp

#include

#include

#include "observer.hpp"

class observer;

class subject ;

class subject1 : public subject

};class subject2 : public subject

};#endif /* subject_hpp */

// subject.cpp

#include "subject.hpp"

subject::subject()

subject::~subject()

void subject::set_state(std::string state)

std::string subject::get_state()

void subject::attach(observer* observer_instance)

}void subject::detach(observer* observer_instance)

}void subject::notify()

}

// main.cpp

#include

"subject.hpp"

using std::cout;

using std::endl;

int main()

subject attach

subject attach

subject attach

observer1 update

observer2 update

start both ob1 & ob2:

ob1: start ob2:start

subject detach

observer2 update

end ob2:

ob1: start ob2:end

兩個互相引用的類的實現問題

╓ a.hpp ═#include "b.hpp" class b;╙ a.cpp

╓ b.hpp ═#include "a.hpp" class a;

╙ b.cpp

python觀察者模式 python 觀察者模式

python 觀察者模式 前言e 寫的倉促就不截uml類圖了,書本chapter10,p313能看到圖 一旦觀察的主題有更新,就會通知到觀察者們,下面的例子是最簡單的乙個觀察者範例,假設這是一群投機分子密切關注 軍 火 倉庫的產品與數量變動 class inventory def init self...

觀察者模式

觀察者模式 observer 完美的將觀察者和被觀察的物件分離開。舉個例子,使用者介面可以作為乙個觀察者,業務資料是被觀察者,使用者介面觀察業務資料的變化,發現資料變化後,就顯示在介面上。物件導向設計的乙個原則是 系統中的每個類將重點放在某乙個功能上,而不是其他方面。乙個物件只做一件事情,並且將他做...

觀察者模式

觀察者模式定義了一種一對多的依賴關係,讓多個觀察者物件同時監聽某乙個主題物件。這個主題物件在狀態上發生變化時,會通知所有觀察者物件,讓他們能夠自動更新自己 任何乙個模式都是離不開角色的,這裡也會有幾種角色 抽象主題角色 把所有對觀察者物件的引用儲存在乙個集合中,每個抽象主題角色都可以有任意數量的觀察...