前言
之前做了乙個效能測試的專案,就是需要對現在的產品進行效能測試,獲得測試資料,然後書寫測試報告,並提出合理化的改善意見。專案很簡單,我們獲得了一系列效能測試資料,對於資料,我們需要在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 設計模式之觀察者模式
觀察者設計模式定義了物件間的一對多的依賴關係,乙個物件的行為依賴於另乙個物件的狀態的情況下,當物件狀態發生變化時,依賴它的物件會得到通知並自動重新整理。觀察者模式中主要有兩種角色 觀察者和監聽者 觀察者主要是在事件到來時,通知對於該事件感興趣的監聽者來處理事件。所以它的職責也就顯而易見了 通知觀察者...