observer模式的典型實現:
subject.h note:1.subject類依賴obserer介面類。2.attach又叫register/subscribe/addobserver,detach又叫release/unsubscribe/removeobserver。todo:attach方法應該判斷乙個observer有沒有被重複新增。detach應確保obserer存在。考慮subject物件銷毀如何通知observer。
#ifndef dp_subject_h#define dp_subject_h#include
"observer.h
"#include
class
subject
virtual
void attach(observer*observer)
virtual
void detach(observer*observer)
virtual
void
notify()
}protected
: subject()
private
: std::list
*observers;
};#endif
observer.h
#ifndef dp_observer_h#define dp_observer_h
class
subject;
class
observer
virtual
void update(subject* subject) = 0
;protected
: observer()
};#endif
concretesubject.h note:setstate方法裡直接呼叫notify可以減輕使用者負擔。
#ifndef dp_concretesubject_h#define dp_concretesubject_h#include
"subject.h
"#include
class concretesubject : public
subject
void setstate(const std::string&state)
std::string
getstate()
private
: std::
string
subjectstate;
};#endif
concreteobserver.h note:1.細節通過呼叫getstate向concretesubject查詢,屬於拉模型。2.要是update引數包括全部或部分細節,則是推模型。3.定義乙個collection成員儲存多個subject,不在建構函式裡初始化繫結subject,而是通過動態的方式註冊,可以實現觀察多個subject。 todo:update函式應該對dynamic_cast的異常情況進行處理。
#ifndef dp_concreteobserver_h#define dp_concreteobserver_h#include
"observer.h
"#include
class concretesubject;
class concreteobserver : public
observer
virtual ~concreteobserver()
virtual
void update(subject*subject)
}private
: subject*subject;
std::
string
observerstate;
};#endif
main.cpp
#include"concretesubject.h
"#include
"concreteobserver.h
"int
main()
設計模式Observer
observer設計模式的定義 定義了物件之間的一對多的依賴,這樣以來,當乙個物件改變狀態時,它的所有依賴者都會受到通知並自動更新。ifndef subjec h define subjec h include observer.h class subject subject subject sub...
Observer設計模式
observer設計模式是針對 乙個物件對多個物件中,乙個物件發生狀態改變,其他附屬物件發生相應的更新。是一種松耦合的設計模式。例子 假設我們有個高檔的熱水器,我們給它通上電,當水溫超過95度的時候 1 揚聲器會開始發出語音,告訴你水的溫度 2 液晶屏也會改變水溫的顯示,來提示水已經快燒開了。現在我...
設計模式 Observer
定義物件間的一種一對多的依賴關係,當乙個物件的狀態發生改變時,所有依賴於它的物件都得到通知並被自動更新。dependents,publish subscribe 適用性 結構 允許你獨立的改變subject和observer。優缺點 1.建立subject到其observer之間的對映 最簡單的方法...