觀察者(observer)模式,是常見的模式之一。比如乙份報紙,有很多訂戶。訂閱者並不知道報紙何時會送來,他只知道自己訂了這份報紙。訂閱者在這裡擔任著觀察者的角色,而報社則是被觀察者。
報紙一旦印刷完畢,就應該及時送到訂戶手中,如果將報社看作乙個物件,則報紙便是觀察者(訂戶)和被觀察者(報社)之間的紐帶。觀察者需要維護乙個與報紙相關的變數或函式,在這個具體問題中,這個變數就是訂戶是否收到報紙,可設定為乙個布林型,當收到時,訂戶需要更新這個變數。
下面是原始碼:
// "observer.h"
#ifndef _observer_h_
#define _observer_h_
#include using namespace std;
class observer;
/* 被觀察者介面 */
class subject
void attach(observer *oo);//訂閱此物件
void detach(observer *oo);//解除訂閱
void notify();//通知訂閱者更新
void virtual issue() = 0;//發行函式
bool getissue()
~subject()
m_observerlist.clear();
}protected:
bool m_issue;//發行標誌
listm_observerlist;//訂閱者佇列
};/*觀察者介面*/
class observer
; void virtual update()//更新函式
void virtual showmessage() = 0;//模擬與被觀察者相關的函式
protected:
bool m_receive;//收到報紙標誌
};/* 具體的被觀察者 */
class concretesubject:public subject
void issue();
};/* 具體的觀察者 */
class subscriber1:public observer
;class subscriber2:public observer
;#endif
被觀察者介面說明:
1.訂閱物件、解除訂閱、通知更新的函式,是所有被觀察者共有行為,所以將其抽象出來作為被觀察者的介面。
2.發行函式模擬改變狀態函式,因為不同的被觀察者有不同的方式,所以將其宣告為純虛函式,在派生類中實現。
3.觀察者用std中的list模板來實現,所以需要析構函式來釋放。
觀察者介面說明:
1.由於所有觀察者都有更新狀態這一操作,所以將其宣告為介面。
2.update()函式對於不同的具體物件,有不同的行為,所以在派生類中實現,宣告為純虛函式。
3.showmessage()函式用來模擬與被觀察者相關的操作,如果被觀察者狀態改變,觀察者需要執行某種操作,則在這裡實現。本例中用來顯示收到報紙這一資訊。
下面是類的實現部分:observer.cpp
#include "observer.h"
#include #include /* 訂閱報紙 */
void subject::attach(observer *oo)
/* 取消訂閱 */
void subject::detach(observer *oo)
}/*通知更新*/
void subject::notify()
}/* 更改狀態 */
void concretesubject::issue()
}/*訂閱者更新*/
void subscriber1::update()
void subscriber1::showmessage()
/*訂閱者更新*/
void subscriber2::update()
void subscriber2::showmessage()
下面是主程式部分:
#include "observer.h"
#include int main()
else
sub->issue(); //發行報紙
coutelse
sub->detach(customer1);//觀察者1取消訂閱
sub->issue(); //發行報紙
return 0;
}
C 觀察者模式(Observer)
當有很多個物件依賴於乙個狀態值時,為了在狀態值改變時統一的通知這些物件作出相應的改變,類似廣播通知 include include include include 觀察者抽象類 class cobserver virtual cobserver 狀態更新時的處理方法 virtual void upd...
Observer觀察者模式(C )
subject observers observer pattern 觀察者模式定義 物件之間的一對多依賴關係,當乙個物件改變狀態時,所有依賴於它的物件都會自動獲得通知 觀察者模式應用 主題物件只與觀察者基類有耦合 客戶配置觀察者的數量與型別 observers首先要知道subject,然後把自己註...
C 觀察者模式(Observer)
理解 訂閱 發布。把所有需要通知的物件新增到發布者類裡面。發布者更改自己狀態後通知觀察者 using system.collections.generic using system.windows.forms namespace designmode.observer public class we...