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