要點:編程
一、如何使用觀察者模式:架構
對應使用這個模式的用戶(main)來講,subject和observer這兩個基類是不被關係的,在調用者(main)中只是有concreteSubject和concreteObserver這兩個具體目標和具體觀察者來構建對象和程序。函數
int _tmain(int argc, _TCHAR* argv [])
{
ConcreteSubject* CS = new ConcreteSubject();
ConcreteObserver* CO = new ConcreteObserver(CS);
ConcreteObserver* CO1 = new ConcreteObserver(CS);
UpdateData* UD = new UpdateData();
UD->FirstValue = 123;
UD->SecendValue = 456;
CS->SetData(UD);this
return 0;
}server
二、信息刷新的操做由誰發起對象
觀察者和目標均可以發起數據刷新的操做,可是從習慣上來說由目標來刷新數據更爲直觀合理。blog
三、代碼實現的要點:事件
將目標基類對象(subject)做爲一個參數傳遞到觀察者具體類的構造函數中(ConcreteObserver.ConcreteObserver(Subject*)),而後將這個Subject對象做爲ConcreteObserver的一個成員變量存儲起來,然後調用這個成員變量的Attach方法,即把觀察者註冊給目標,就比如完成了把訂報讀者的地址信息註冊到郵局同樣。get
ConcreteObserver::ConcreteObserver(Subject* s)
{
_subject = s;
_subject->AttachObserver(this);
}源碼
五、程序的執行流程
將觀察者註冊給目標,從而讓目標知道誰須要更新數據。
更新具體目標類對象的數據,更新方法由具體目標類對象調用目標基類的遍歷方法,遍歷全部註冊的具體觀察者對象,而後調用這些具體觀察者的Update方法實現更新。
六、觀察者模式和C#事件的關係
若是忽略委託的動態綁定函數的功能,事件編程模式和觀察者模式是相同的。
事件的定義方(定義Event的類)就是目標,註冊事件方法的地方就是觀察者(即寫xEvent+=***的地方)。
這樣理解起來更直觀:事件定義方(目標)只關心何時發數據。事件使用方只關心收到數據後要幹什麼。而定義方不用關心這些數據發出去後用於什麼用途,使用方也沒必要關心何時會收到數據。而數據發給誰或者該接收誰的數據是由調用這個結構的用戶來決定綁定關係的。
在事件模式中只存在目標和調用者,即調用者就是觀察者。而在觀察者模式中有三個角色:調用者(main函數)、目標、觀察者。
七、觀察者模式一般用來實現MVC架構