C 實現觀察者模式

2021-08-22 09:53:17 字數 3130 閱讀 5246

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

完美的將觀察者和被觀察的物件分離開。【

有時又被稱為

模型-檢視(view)模式

、源-收聽者(listener)模式

或為發布-訂閱模式

(目標就是通知的發布者,觀察者是通知的訂閱者(接受通知))。

】 observer 的乙個例項model/view/control(mvc)

結構在系統開發架構設計中有著很重要的地位和意義,mvc實現了業務邏輯和表示層的解耦。 e

g:①使用者介面可以作為乙個觀察者,業務資料是被觀察者,使用者介面觀察業務資料的變化,發現資料變化後,就顯示在介面上。系統中的每個類將重點放在某乙個功能上,而不是其他方面。乙個物件只做一件事情,並且將他做好。觀察者模式在模組之間劃定了清晰的界限,提高了應用程式的可維護性和重用性。

②對同一組資料進行統計分析時候,我們希望能夠提供多種形式的表示(例如以**進行統計顯示、柱狀圖統計顯示、百分比統計顯示等)。這些表示都依賴於同一組資料,我們當然需要當資料改變的時候,所有的統計的顯示都能夠同時改變。

目標 subject 提供依賴於它的觀察者 observer 的註冊(attach)和登出(detach)操作,並且提供了使得依賴於它的所有觀察者同步的操作(notify)。觀察者 observer 則提供乙個 update 操作,注意這裡的 observer 的 update 操作並不在  subject 目標狀態改變了的時候就對自己進行更新,這個更新操作要延遲到 subject 物件發出 notify 通知所有observer 進行修改(呼叫 update)

實現如下:

#ifndef _subject_h_

#define _subject_h_

#include #include #include using namespace std;

typedef string state;

class observer;

class subject

; class concretesubject:public subject

; #endif

#include "subject.h"

#include "observer.h"

#include #include using namespace std;

typedef string state;

subject::subject()

subject::~subject()

void subject::attach(observer* obv) //註冊

void subject::detach(observer* obv) //登出

void subject::notify() }

concretesubject::concretesubject()

concretesubject::~concretesubject()

state concretesubject::getstate()

void concretesubject::setstate(const state& st)

#ifndef _observer_h_ 

#define _observer_h_

#include "subject.h"

#include using namespace std;

typedef string state;

class observer ;

class concreteobservera:public observer

; class concreteobserverb:public observer

; #endif

#include "observer.h"

#include "subject.h"

#include #include using namespace std;

observer::observer()

observer::~observer()

concreteobservera::concreteobservera(subject* sub)

concreteobservera::~concreteobservera() }

subject* concreteobservera::getsubject()

void concreteobservera::printinfo()

concreteobserverb::concreteobserverb(subject* sub)

concreteobserverb::~concreteobserverb() }

subject* concreteobserverb::getsubject()

void concreteobserverb::printinfo()

#include "subject.h"

#include "observer.h"

#include using namespace std;

int main(int argc,char* argv)

subject 維護乙個 list 作為儲存其所有觀察者的容器。每當呼叫notify操作就遍歷list 中的observer物件,並廣播通知改變狀態(呼叫observer的update操作)。目標的狀態 state 可以由 subject 自己改變(示例),也可以由 observer 的某個操作引起 state 的改變(可呼叫 subject 的 setstate 操作)。notify 操作可以由 subject 目標主動廣播(示例),也可以由 observer 觀察者來呼叫(因為 observer 維護乙個指向 subject 的指標)。執行示例程式,可以看到當 subject 處於狀態「old」時候,依賴於它的兩個觀察者都顯示「old」,當目標狀態改變為「new」的時候,依賴於它的兩個觀察者也都改變為「new」。

C 實現觀察者模式

舉乙個例子 報社發行報紙 你訂閱報紙,一旦有新一期的報紙發行,新報紙就會送到你家裡,只要你一直訂閱,你就一直會收到新報紙 你不再訂閱報紙的時候,就收不到以後的新報紙了 報社運營的時候,一直會有人去訂閱或者取消訂閱報紙.發布者 訂閱者 觀察者模式 publishers subscribers obse...

觀察者模式 C 實現

定義物件間的一種一對多的依賴關係,當乙個物件的狀態發生改變時,所有依賴於它的物件都得到通知並被自動更新。觀察者模式有四個角色 抽象主題 具體主題 抽象觀察者 具體觀察者。抽象主題 把所有觀察者物件的引用儲存到乙個聚集裡,每個主題都可以有任何數量的觀察者。具體主題 將有關狀態存入具體觀察者物件 在具體...

觀察者模式 C 實現

cpp include include include include 氣象監控應用問題 head first 設計模式案例 using namespace std class observer 觀察者公共介面 class subject 主題公共介面 問題 成員函式為什麼不能用純虛函式?virtu...