Android 設(shè)計(jì)模式 之 觀察者模式_第1頁
Android 設(shè)計(jì)模式 之 觀察者模式_第2頁
Android 設(shè)計(jì)模式 之 觀察者模式_第3頁
Android 設(shè)計(jì)模式 之 觀察者模式_第4頁
Android 設(shè)計(jì)模式 之 觀察者模式_第5頁
已閱讀5頁,還剩5頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、1. /*2. *觀察者模式3. *定義對(duì)象間的一種一個(gè)(Subject)對(duì)多(Observer)的依賴關(guān)系,當(dāng)一個(gè)對(duì)象的狀態(tài)發(fā)送改變時(shí),所以依賴于它的4. *對(duì)象都得到通知并被自動(dòng)更新5. *6. *當(dāng)然,MVC只是Observer模式的一個(gè)實(shí)例。Observer模式要解決的問題為:7. *建立一個(gè)一(Subject)對(duì)多(Observer)的依賴關(guān)系,并且做到當(dāng)“一”變化的時(shí)候,8. *依賴這個(gè)“一”的多也能夠同步改變。最常見的一個(gè)例子就是:對(duì)同一組數(shù)據(jù)進(jìn)行統(tǒng)計(jì)分析時(shí)候,9. *我們希望能夠提供多種形式的表示(例如以表格進(jìn)行統(tǒng)計(jì)顯示、柱狀圖統(tǒng)計(jì)顯示、百分比統(tǒng)計(jì)顯示等)。10. *這些表示都

2、依賴于同一組數(shù)據(jù),我們當(dāng)然需要當(dāng)數(shù)據(jù)改變的時(shí)候,所有的統(tǒng)計(jì)的顯示都能夠同時(shí)改變。11. *Observer模式就是解決了這一個(gè)問題。12. *13. *適用性:14. *1.當(dāng)一個(gè)抽象模型有兩個(gè)方面,其中一個(gè)方面依賴于另一方面15. *將這兩者封裝成獨(dú)立的對(duì)象中以使它們可以各自獨(dú)立的改變和服用16. *17. *2.當(dāng)對(duì)一個(gè)對(duì)象的改變需要同時(shí)改變其他對(duì)象,而不知道具體有多少對(duì)象有待改變18. *19. *3.當(dāng)一個(gè)對(duì)象必須通知其它對(duì)象,而它又不能假定其它對(duì)象是誰20. *21. *參與者:22. *1.Subject(目標(biāo))23. *目標(biāo)知道它的觀察者,可以有任意多個(gè)觀察者觀察同一個(gè)目標(biāo)24.

3、 *提供注冊(cè)和刪除觀察者對(duì)象的接口25. *26. *2.Observer(觀察者)27. *為那些在目標(biāo)發(fā)生改變時(shí)需獲得通知的對(duì)象定義個(gè)更新的接口28. *29. *3.ConcreteSubject(具體目標(biāo))30. *將有關(guān)狀態(tài)存入各ConcreteObserver對(duì)象31. *當(dāng)它的狀態(tài)發(fā)送改變時(shí),向它的各個(gè)觀察者發(fā)出通知32. *33. *4.ConcreteObserver(具體觀察者)34. *維護(hù)一個(gè)指向ConcreteObserver對(duì)象的引用35. *存儲(chǔ)有關(guān)狀態(tài),這些狀態(tài)應(yīng)與目標(biāo)的狀態(tài)保持一致36. *實(shí)現(xiàn)Observer的更新接口是自身狀態(tài)與目標(biāo)的狀態(tài)保持一致37. *

4、38. *39. */有空我將把UML圖補(bǔ)上。下面看看Android使用到的觀察者模式.觀察者(DataSetObserver),目標(biāo)(Observable),具體目標(biāo)(DataSetObserverable)Observer(觀察者),DataSetObserver抽象2個(gè)方法,一個(gè)是觀察數(shù)據(jù)改變的方法,一個(gè)是觀察數(shù)據(jù)變成無效(或者不可用)時(shí)的方法。源碼路徑:framework/base/core/java/android/database/DataSetObserver.javajavaview plaincopyprint?1. packageandroid.database;2. 3.

5、 /*4. *Receivescallbackswhenadatasethasbeenchanged,ormadeinvalid.Thetypicallydatasets5. *thatareobservedarelinkCursorsorlinkandroid.widget.Adapters.6. *DataSetObservermustbeimplementedbyobjectswhichareaddedtoaDataSetObservable.7. */8. publicabstractclassDataSetObserver9. /*10. *Thismethodiscalledwhe

6、ntheentiredatasethaschanged,11. *mostlikelythroughacalltolinkCursor#requery()onalinkCursor.12. */13. publicvoidonChanged()14. /Donothing15. 16. 17. /*18. *Thismethodiscalledwhentheentiredatabecomesinvalid,19. *mostlikelythroughacalltolinkCursor#deactivate()orlinkCursor#close()ona20. *linkCursor.21.

7、*/22. publicvoidonInvalidated()23. /Donothing24. 25. Subject(目標(biāo)),Observable是一個(gè)泛型的抽象類,主要功能是注冊(cè)和撤銷observer。源碼路徑:framework/base/core/java/android/database/Observable.javajavaview plaincopyprint?1. packageandroid.database;2. 3. importjava.util.ArrayList;4. 5. /*6. *Providesmethodsfor(un)registeringarbitr

8、aryobserversinanArrayList.7. */8. publicabstractclassObservable9. /*10. *Thelistofobservers.Anobservercanbeinthelistatmost11. *onceandwillneverbenull.12. */13. protectedfinalArrayListmObservers=newArrayList();14. 15. /*16. *Addsanobservertothelist.Theobservercannotbenullanditmustnotalready17. *bereg

9、istered.18. *paramobservertheobservertoregister19. *throwsIllegalArgumentExceptiontheobserverisnull20. *throwsIllegalStateExceptiontheobserverisalreadyregistered21. */22. publicvoidregisterObserver(Tobserver)23. if(observer=null)24. thrownewIllegalArgumentException(Theobserverisnull.);25. 26. synchr

10、onized(mObservers)27. if(mObservers.contains(observer)28. thrownewIllegalStateException(Observer+observer+isalreadyregistered.);29. 30. mObservers.add(observer);31. 32. 33. 34. /*35. *Removesapreviouslyregisteredobserver.Theobservermustnotbenullandit36. *mustalreadyhavebeenregistered.37. *paramobser

11、vertheobservertounregister38. *throwsIllegalArgumentExceptiontheobserverisnull39. *throwsIllegalStateExceptiontheobserverisnotyetregistered40. */41. publicvoidunregisterObserver(Tobserver)42. if(observer=null)43. thrownewIllegalArgumentException(Theobserverisnull.);44. 45. synchronized(mObservers)46

12、. intindex=mObservers.indexOf(observer);47. if(index=-1)48. thrownewIllegalStateException(Observer+observer+wasnotregistered.);49. 50. mObservers.remove(index);51. 52. 53. 54. /*55. *Removeallregisteredobserver56. */57. publicvoidunregisterAll()58. synchronized(mObservers)59. mObservers.clear();60.

13、61. 62. ConcreateSubject(具體目標(biāo)),實(shí)現(xiàn)的方法同Oberver一樣,只不過它是通知ArrayList下的每個(gè)Oberver去執(zhí)行各自的action。源碼路徑:framework/base/core/java/android/database/DataSetObservable.javajavaview plaincopyprint?1. packageandroid.database;2. 3. /*4. *AspecializationofObservableforDataSetObserverthatprovidesmethodsfor5. *invokingth

14、evariouscallbackmethodsofDataSetObserver.6. */7. publicclassDataSetObservableextendsObservable8. /*9. *InvokesonChangedoneachobserver.Calledwhenthedatasetbeingobservedhas10. *changed,andwhichwhenreadcontainsthenewstateofthedata.11. */12. publicvoidnotifyChanged()13. synchronized(mObservers)14. /sinc

15、eonChanged()isimplementedbytheapp,itcoulddoanything,including15. /removingitselffromlinkmObservers-andthatcouldcauseproblemsif16. /aniteratorisusedontheArrayListlinkmObservers.17. /toavoidsuchproblems,justmarchthruthelistinthereverseorder.18. for(inti=mObservers.size()-1;i=0;i-)19. mObservers.get(i)

16、.onChanged();20. 21. 22. 23. 24. /*25. *InvokesonInvalidatedoneachobserver.Calledwhenthedatasetbeingmonitored26. *haschangedsuchthatitisnolongervalid.27. */28. publicvoidnotifyInvalidated()29. synchronized(mObservers)30. for(inti=mObservers.size()-1;i=0;i-)31. mObservers.get(i).onInvalidated();32. 3

17、3. 34. 35. ConcreateObserver(具體觀察者),具體觀察者的任務(wù)是實(shí)實(shí)在在執(zhí)行action的類,一般由開發(fā)者根據(jù)實(shí)際情況,自己實(shí)現(xiàn)。android也有實(shí)現(xiàn)的例子源碼路徑:framework/base/core/java/android/widget/AbsListView.javajavaview plaincopyprint?1. classAdapterDataSetObserverextendsAdapterView.AdapterDataSetObserver2. Override3. publicvoidonChanged()4. super.onChange

18、d();5. if(mFastScroller!=null)6. mFastScroller.onSectionsChanged();7. 8. 9. 10. Override11. publicvoidonInvalidated()12. super.onInvalidated();13. if(mFastScroller!=null)14. mFastScroller.onSectionsChanged();15. 16. 17. framework/base/core/java/android/widget/AdapterView.javajavaview plaincopyprint?

19、1. classAdapterDataSetObserverextendsDataSetObserver2. 3. privateParcelablemInstanceState=null;4. 5. Override6. publicvoidonChanged()7. mDataChanged=true;8. mOldItemCount=mItemCount;9. mItemCount=getAdapter().getCount();10. if(DBG)11. Xlog.d(TAG,AdapterViewonChanged:mOldItemCount=+mOldItemCount12. +

20、,mItemCount=+mItemCount+,getAdapter()=+getAdapter()13. +,AdapterView=+AdapterView.this,newThrowable(onChanged);14. 15. 16. /Detectthecasewhereacursorthatwaspreviouslyinvalidatedhas17. /beenrepopulatedwithnewdata.18. if(AdapterView.this.getAdapter().hasStableIds()&mInstanceState!=null19. &mOldItemCou

21、nt=0&mItemCount0)20. AdapterView.this.onRestoreInstanceState(mInstanceState);21. mInstanceState=null;22. else23. rememberSyncState();24. 25. checkFocus();26. requestLayout();27. 28. 29. Override30. publicvoidonInvalidated()31. mDataChanged=true;32. 33. if(DBG)34. Xlog.d(TAG,AdapterViewonInvalidated:

22、mOldItemCount=+mOldItemCount35. +,mItemCount=+mItemCount+,getAdapter()=+getAdapter()36. +,AdapterView=+AdapterView.this,newThrowable(onInvalidated);37. 38. 39. if(AdapterView.this.getAdapter().hasStableIds()40. /Rememberthecurrentstateforthecasewhereourhostingactivityisbeing41. /stoppedandlaterresta

23、rted42. mInstanceState=AdapterView.this.onSaveInstanceState();43. 44. 45. /Dataisinvalidsoweshouldresetourstate46. mOldItemCount=mItemCount;47. mItemCount=0;48. mSelectedPosition=INVALID_POSITION;49. mSelectedRowId=INVALID_ROW_ID;50. mNextSelectedPosition=INVALID_POSITION;51. mNextSelectedRowId=INVA

24、LID_ROW_ID;52. mNeedSync=false;53. 54. checkFocus();55. requestLayout();56. 57. 58. publicvoidclearSavedState()59. mInstanceState=null;60. 61. 實(shí)例:型運(yùn)用是大家熟悉的BaseAdapter,BaseAdapter關(guān)聯(lián)了一個(gè)DataSetObservable對(duì)象,并實(shí)現(xiàn)registerDataSetObserver和unregisterDataSetObserver兩個(gè)方法實(shí)現(xiàn)注冊(cè)和撤銷Observer,方法notifyDataSetChanged間接調(diào)

25、用Observer的實(shí)現(xiàn)者的onChange()方法,以達(dá)到通知數(shù)據(jù)改變的作用。使用ListView和BaseAdapter組合時(shí),當(dāng)BaseAdapter的item改變時(shí),我們經(jīng)常會(huì)調(diào)用notifyDataSetChanged(),通知Listview刷新。但是,但是,但是,我們從來沒有調(diào)用BaseAdapter的registerDataSetObserver(DataSetObserver observer)注冊(cè)O(shè)bserver,那么Listview如何接收到通知,并執(zhí)行刷新動(dòng)作呢?我們來看看ListView做了什么javaview plaincopyprint?1. /*2. *Sets

26、thedatabehindthisListView.3. *4. *TheadapterpassedtothismethodmaybewrappedbyalinkWrapperListAdapter,5. *dependingontheListViewfeaturescurrentlyinuse.Forinstance,adding6. *headersand/orfooterswillcausetheadaptertobewrapped.7. *8. *paramadapterTheListAdapterwhichisresponsibleformaintainingthe9. *datab

27、ackingthislistandforproducingaviewtorepresentan10. *iteminthatdataset.11. *12. *see#getAdapter()13. */14. Override15. publicvoidsetAdapter(ListAdapteradapter)16. if(mAdapter!=null&mDataSetObserver!=null)17. mAdapter.unregisterDataSetObserver(mDataSetObserver);18. 19. 20. resetList();21. mRecycler.clear();22. 23. if(mHeaderViewInfos.size()0|mFooterViewInfos.size()0)24. mAdapter=newHeaderViewListAdapter(mHeaderViewInfos,mFooterViewInfos,adapter);25. else26. mAdapter=adapter;27. 28. 29. mOldSelectedPosition=INVALI

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論