引例:銀行現在的業務大多有提醒業務,比如我們用信用卡消費的時候銀行會有短信通知和Email通知等方法立即提醒客戶賬戶發生了變化。這就是典型的Observer模式,A(賬戶)發生變化之后通知B(手機)和C(Email),以后也許還會通知D(電話)等等。。。程序設計中也會遇到很多這樣的問題,比如說MFC中的Document/View架構,Document中的數據變化會立即通知View的顯示也相應變化,View的顯示變化后也會通知Document中的數據產生對應變化;再比如回調函數,觸發某個事件后通知調用回調函數。但凡“通知依賴”問題大都可以用到Observer模式。動機:為某些對象建立“通知依賴關系”——“一個對象的狀態發生改變,那么與之相關的所有對象都要改變”。顯然這種關系是緊耦合的,為保證這種結構在遇到變化時能夠比較穩定,我們必須使之松耦合。意圖:定義對象間的一種一對多關系,以便當一個對象的狀態發生改變時,所有依賴它的對象都得到通知和自動更新(GoF23)設計思路:我們的目的是在A的狀態發生改變時會自動通知B,上下兩幅圖分別代表了兩個設計的方法。上圖是一種較容易想到的解決方法,但是可以看出A依賴于B,兩者是緊耦合關系。OO中有一個重要的原則就是“依賴倒置原則”,于是就有了下圖:接口IA依賴于接口IB,而IA和IB是從A,B中抽象出來的相對穩定的部分,IA和IB之間的依賴關系相對穩定,不易變化。Ok,就是這么簡單!Observer模式的思想就是這樣!問題的關鍵在于如何抽象IA和IB,下面是GoF23對Observer模式描述的UML圖其中Subject即接口IA,Observer即接口IB。Observer只有一個方法Update,用于更新具體的Observer。Subject一般有一個List用于保存Observer的信息;Attach負責添加Observer;Detach負責刪除Observer;Notify通知List中的所有Observer調用Update。
posted on 2009-04-05 22:51 Alex@VCC 閱讀(1748) 評論(3) 編輯 收藏 引用 所屬分類: 設計模式
非常感謝!設計模式其實非常重要,希望斑竹出更多更好的設計模式的文章。 回復 更多評論
牛人太多了..... 回復 更多評論
樓主這么寫 不合邏輯吧?BankAcount 不保存用戶信息?class BankAccount:public Isubject{public: void notify(account &person){ for(vector<Iobserver*>::iterator it=Observer.begin();it!=Observer.end();it++){ (*it)->update(person); } } BankAccount(int num,string str){ add(new email); add(new phone); person.email=str; person.phonename=num; } void withdraw(){ // account one={1,"2"}; notify(person); }private: account person;}; 回復 更多評論
Powered by: C++博客 Copyright © Alex@VCC