引例:銀行現(xiàn)在的業(yè)務(wù)大多有提醒業(yè)務(wù),比如我們用信用卡消費(fèi)的時(shí)候銀行會(huì)有短信通知和Email通知等方法立即提醒客戶賬戶發(fā)生了變化。這就是典型的Observer模式,A(賬戶)發(fā)生變化之后通知B(手機(jī))和C(Email),以后也許還會(huì)通知D(電話)等等。。。程序設(shè)計(jì)中也會(huì)遇到很多這樣的問題,比如說MFC中的Document/View架構(gòu),Document中的數(shù)據(jù)變化會(huì)立即通知View的顯示也相應(yīng)變化,View的顯示變化后也會(huì)通知Document中的數(shù)據(jù)產(chǎn)生對(duì)應(yīng)變化;再比如回調(diào)函數(shù),觸發(fā)某個(gè)事件后通知調(diào)用回調(diào)函數(shù)。但凡“通知依賴”問題大都可以用到Observer模式。動(dòng)機(jī):為某些對(duì)象建立“通知依賴關(guān)系”——“一個(gè)對(duì)象的狀態(tài)發(fā)生改變,那么與之相關(guān)的所有對(duì)象都要改變”。顯然這種關(guān)系是緊耦合的,為保證這種結(jié)構(gòu)在遇到變化時(shí)能夠比較穩(wěn)定,我們必須使之松耦合。意圖:定義對(duì)象間的一種一對(duì)多關(guān)系,以便當(dāng)一個(gè)對(duì)象的狀態(tài)發(fā)生改變時(shí),所有依賴它的對(duì)象都得到通知和自動(dòng)更新(GoF23)設(shè)計(jì)思路:我們的目的是在A的狀態(tài)發(fā)生改變時(shí)會(huì)自動(dòng)通知B,上下兩幅圖分別代表了兩個(gè)設(shè)計(jì)的方法。上圖是一種較容易想到的解決方法,但是可以看出A依賴于B,兩者是緊耦合關(guān)系。OO中有一個(gè)重要的原則就是“依賴倒置原則”,于是就有了下圖:接口IA依賴于接口IB,而IA和IB是從A,B中抽象出來的相對(duì)穩(wěn)定的部分,IA和IB之間的依賴關(guān)系相對(duì)穩(wěn)定,不易變化。Ok,就是這么簡(jiǎn)單!Observer模式的思想就是這樣!問題的關(guān)鍵在于如何抽象IA和IB,下面是GoF23對(duì)Observer模式描述的UML圖其中Subject即接口IA,Observer即接口IB。Observer只有一個(gè)方法Update,用于更新具體的Observer。Subject一般有一個(gè)List用于保存Observer的信息;Attach負(fù)責(zé)添加Observer;Detach負(fù)責(zé)刪除Observer;Notify通知List中的所有Observer調(diào)用Update。
posted on 2009-04-05 22:51 Alex@VCC 閱讀(1757) 評(píng)論(3) 編輯 收藏 引用 所屬分類: 設(shè)計(jì)模式
非常感謝!設(shè)計(jì)模式其實(shí)非常重要,希望斑竹出更多更好的設(shè)計(jì)模式的文章。 回復(fù) 更多評(píng)論
牛人太多了..... 回復(fù) 更多評(píng)論
樓主這么寫 不合邏輯吧?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;}; 回復(fù) 更多評(píng)論
Powered by: C++博客 Copyright © Alex@VCC