一、什么是觀察者模式
Observer模式也叫觀察者模式,是由GoF提出的23種軟件設(shè)計(jì)模式的一種。Observer模式是行為模式之一,它的作用是當(dāng)一個(gè)對(duì)象的狀態(tài)發(fā)生變化時(shí),能夠自動(dòng)通知其他關(guān)聯(lián)對(duì)象,自動(dòng)刷新對(duì)象狀態(tài)。
觀察者模式(Observer)完美的將觀察者和被觀察的對(duì)象分離開。舉個(gè)例子,用戶界面可以作為一個(gè)觀察者,業(yè)務(wù)數(shù)據(jù)是被觀察者,用戶界面觀察業(yè)務(wù)數(shù)據(jù)的變化,發(fā)現(xiàn)數(shù)據(jù)變化后,就顯示在界面上。面向?qū)ο笤O(shè)計(jì)的一個(gè)原則是:系統(tǒng)中的每個(gè)類將重點(diǎn)放在某一個(gè)功能上,而不是其他方面。一個(gè)對(duì)象只做一件事情,并且將他做好。觀察者模式在模塊之間劃定了清晰的界限,提高了應(yīng)用程序的可維護(hù)性和重用性。
觀察者模式有很多實(shí)現(xiàn)方式,從根本上說(shuō),該模式必須包含兩個(gè)角色:觀察者和被觀察對(duì)象。在剛才的例子中,業(yè)務(wù)數(shù)據(jù)是被觀察對(duì)象,用戶界面是觀察者。觀察者和被觀察者之間存在“觀察”的邏輯關(guān)聯(lián),當(dāng)被觀察者發(fā)生改變的時(shí)候,觀察者就會(huì)觀察到這樣的變化,并且做出相應(yīng)的響應(yīng)。如果在用戶界面、業(yè)務(wù)數(shù)據(jù)之間使用這樣的觀察過程,可以確保界面和數(shù)據(jù)之間劃清界限,假定應(yīng)用程序的需求發(fā)生變化,需要修改界面的表現(xiàn),只需要重新構(gòu)建一個(gè)用戶界面,業(yè)務(wù)數(shù)據(jù)不需要發(fā)生變化。
“觀察”不是“直接調(diào)用”
實(shí)現(xiàn)觀察者模式的時(shí)候要注意,觀察者和被觀察對(duì)象之間的互動(dòng)關(guān)系不能體現(xiàn)成類之間的直接調(diào)用,否則就將使觀察者和被觀察對(duì)象之間緊密的耦合起來(lái),從根本上違反面向?qū)ο蟮脑O(shè)計(jì)的原則。無(wú)論是觀察者“觀察”觀察對(duì)象,還是被觀察者將自己的改變“通知”觀察者,都不應(yīng)該直接調(diào)用。
實(shí)現(xiàn)觀察者模式的形式
實(shí)現(xiàn)觀察者模式有很多形式,比較直觀的一種是使用一種“注冊(cè)——通知——撤銷注冊(cè)”的形式。
實(shí)現(xiàn)觀察者模式例子
下面是C++的實(shí)現(xiàn),在C++實(shí)現(xiàn)中,C++中沒有接口的概念,但是可以用抽象類類代替Java或C#中的接口,在C++中抽象類中從派生類中抽象出來(lái)的函數(shù)(方法),必須定義成純虛函數(shù),這樣在后面的使用中才可以通過基類的指針來(lái)訪問這些函數(shù),面向?qū)ο蟮恼Z(yǔ)言中有個(gè)特點(diǎn),多態(tài)只能訪問兩者中共有的部分。
以上文字參照http://blog.csdn.net/preciousboy/article/details/6230467,對(duì)其代碼進(jìn)行修改在vs2008中編譯調(diào)試通過。結(jié)果運(yùn)行為:這里要注意的幾個(gè)問題是?1.被觀察者怎么去通知觀察者數(shù)據(jù)已經(jīng)更新?--本例子中是通過void change()函數(shù)來(lái)實(shí)現(xiàn)的;2.在此模式中你可以從被觀察者處push或者pull數(shù)據(jù),我們認(rèn)為push的方式是正確的。3.觀察者模式定義了一對(duì)多的關(guān)系4.有多個(gè)觀察者時(shí)不依賴于特定的通知次序。5.java的MVC模式就采用此模式實(shí)現(xiàn)。
posted on 2012-05-01 11:47 sheng 閱讀(645) 評(píng)論(0) 編輯 收藏 引用