設計模式五,Observer

2021-08-25 15:42:54 字數 3160 閱讀 9264

觀察者(observer)模式用於解決乙個相當常見的問題:當某些其他物件改變狀態時,如果一組物件需要進行相應的更新,那麼應該如何處理呢?假定有一些資料(即文件)和兩個檢視,乙個圖形檢視和乙個文字檢視,在更改「文件」資料時,必須通知這些檢視更新它們自身,這就是觀察者模式所要完成的任務。

以下**完成observer模式,採用內部內的方式,不過雖然實現了此模式,但內部類的**不斷重複,不是好的方法。

找到更適合的方法再考慮進行更新。

#ifndef observer_h
#define observer_h
class observable;
class argument {};
class observer
};
#endif

// observer_h ///:~

#ifndef observable_h
#define observable_h
#include
#include "observer.h"
class observable
virtual

void clearchanged()

public:
virtual

void addobserver(observer& o)

virtual

void deleteobserver(observer& o)

virtual

void deleteobservers()

virtual

int countobservers()

virtual

bool haschanged()

// if this object has changed, notify all
// of its observers:
virtual

void notifyobservers(argument* arg = 0)

virtual ~observable() {}
};
#endif

// observable_h ///:~

//: c10:observedflower.cpp
// demonstration of "observer" pattern.
#include
#include
#include string>
#include
#include "observable.h"
using

namespace std;

class flower
void open()
void close()
// using the "inner class" idiom:
class opennotifier;
friend class flower::opennotifier;
class opennotifier : public observable
void notifyobservers(argument* arg = 0)
}
void close()
} opennotifier;
class closenotifier;
friend class flower::closenotifier;
class closenotifier : public observable
void notifyobservers(argument* arg = 0)
}
void open()
} closenotifier;
};
class bee
void update(observable*, argument *)
} openobsrv;
// another "inner class" for closings:
class closeobserver;
friend class bee::closeobserver;
class closeobserver : public observer
void update(observable*, argument *)
} closeobsrv;
public:
bee(string nm) : name(nm),
openobsrv(this), closeobsrv(this) {}
observer& openobserver()
observer& closeobserver()
};
class hummingbird
void update(observable*, argument *)
} openobsrv;
class closeobserver;
friend class hummingbird::closeobserver;
class closeobserver : public observer
void update(observable*, argument *)
} closeobsrv;
public:
hummingbird(string nm) : name(nm),
openobsrv(this), closeobsrv(this) {}
observer& openobserver()
observer& closeobserver()
};
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之間的對映 最簡單的方法...