




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、1. /*2. *觀察者模式3. *定義對象間的一種一個(Subject)對多(Observer)的依賴關系,當一個對象的狀態發送改變時,所以依賴于它的4. *對象都得到通知并被自動更新5. *6. *當然,MVC只是Observer模式的一個實例。Observer模式要解決的問題為:7. *建立一個一(Subject)對多(Observer)的依賴關系,并且做到當“一”變化的時候,8. *依賴這個“一”的多也能夠同步改變。最常見的一個例子就是:對同一組數據進行統計分析時候,9. *我們希望能夠提供多種形式的表示(例如以表格進行統計顯示、柱狀圖統計顯示、百分比統計顯示等)。10. *這些表示都
2、依賴于同一組數據,我們當然需要當數據改變的時候,所有的統計的顯示都能夠同時改變。11. *Observer模式就是解決了這一個問題。12. *13. *適用性:14. *1.當一個抽象模型有兩個方面,其中一個方面依賴于另一方面15. *將這兩者封裝成獨立的對象中以使它們可以各自獨立的改變和服用16. *17. *2.當對一個對象的改變需要同時改變其他對象,而不知道具體有多少對象有待改變18. *19. *3.當一個對象必須通知其它對象,而它又不能假定其它對象是誰20. *21. *參與者:22. *1.Subject(目標)23. *目標知道它的觀察者,可以有任意多個觀察者觀察同一個目標24.
3、 *提供注冊和刪除觀察者對象的接口25. *26. *2.Observer(觀察者)27. *為那些在目標發生改變時需獲得通知的對象定義個更新的接口28. *29. *3.ConcreteSubject(具體目標)30. *將有關狀態存入各ConcreteObserver對象31. *當它的狀態發送改變時,向它的各個觀察者發出通知32. *33. *4.ConcreteObserver(具體觀察者)34. *維護一個指向ConcreteObserver對象的引用35. *存儲有關狀態,這些狀態應與目標的狀態保持一致36. *實現Observer的更新接口是自身狀態與目標的狀態保持一致37. *
4、38. *39. */有空我將把UML圖補上。下面看看Android使用到的觀察者模式.觀察者(DataSetObserver),目標(Observable),具體目標(DataSetObserverable)Observer(觀察者),DataSetObserver抽象2個方法,一個是觀察數據改變的方法,一個是觀察數據變成無效(或者不可用)時的方法。源碼路徑: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(目標),Observable是一個泛型的抽象類,主要功能是注冊和撤銷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(具體目標),實現的方法同Oberver一樣,只不過它是通知ArrayList下的每個Oberver去執行各自的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(具體觀察者),具體觀察者的任務是實實在在執行action的類,一般由開發者根據實際情況,自己實現。android也有實現的例子源碼路徑: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. 實例:型運用是大家熟悉的BaseAdapter,BaseAdapter關聯了一個DataSetObservable對象,并實現registerDataSetObserver和unregisterDataSetObserver兩個方法實現注冊和撤銷Observer,方法notifyDataSetChanged間接調
25、用Observer的實現者的onChange()方法,以達到通知數據改變的作用。使用ListView和BaseAdapter組合時,當BaseAdapter的item改變時,我們經常會調用notifyDataSetChanged(),通知Listview刷新。但是,但是,但是,我們從來沒有調用BaseAdapter的registerDataSetObserver(DataSetObserver observer)注冊Observer,那么Listview如何接收到通知,并執行刷新動作呢?我們來看看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等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年食品營養與衛生考試試卷及答案
- 2025年人力資源管理師考試題庫及答案
- 2025年企業發展戰略與管理考試題及答案
- 2025年設備管理考試試卷及答案的解析
- 2025年酒店管理與服務專業資格考試試卷及答案
- 2025年金融科技與創新管理考試題及答案
- 2025年互聯網金融風險管理專業考試試題及答案
- 2025年護士執業資格考試重點試卷及答案
- 《細胞分裂與繁殖過程:五年級生物教學教案》
- 地產游戲活動方案
- 第5章 自動駕駛儀系統《民航飛機自動飛行控制系統》
- DB4401-T 19-2019涉河建設項目河道管理技術規范-(高清現行)
- T∕CSTM 00839-2022 材料基因工程術語
- 通用橋式起重機施工過程記錄表
- 電梯安裝施工進度及保證措施
- NLP神經語言學培訓課件(PPT 164頁)
- 腦卒中康復PPT醫學課件
- 高等數學(下冊)資料期末復習試題與答案
- 四沖程內燃機 機械原理課程設計說明書
- PCB 企業生產工藝及風險點
- Grace評分表、TIMI評分、CRUSAD評分、wells評分等
評論
0/150
提交評論