android源碼中使用的設計模式(行為型--觀察者模式,備忘錄模式)

1.觀察者模式

1.1 定義

定義對象間一種一對多的依賴關系,使得每當一個對象改變狀態,則所有依賴于它的對象得到通知并被自動更新。

1.2 UML

觀察者模式

說明:

  • 1.subject 抽象主題,也就是被觀察(observable)角色,抽象主題角色把所有觀察者對象引用到一個集合
  • 2.concteteSubject:具體主題,該角色將有關狀態存入具體觀察者對象,在具體主題的內部狀態發送改變時,通知注冊過觀察者發出通知,也叫具體被觀察者。
  • 3.observer:抽象觀察者,該角色是觀察者的抽象類,它定義了一個更新接口,使得在得到主題更改時更新自己
  • 4.concreteObserver:具體的觀察者。

1.3.使用場景

  • 1.關聯行為場景,需要注意的是關聯行為是可以分拆的,而不是組合關系
  • 2.事件多級觸發場景
  • 3.跨系統的消息交換場景,如消息隊列,事件總線的處理機制

1.4 兩種模式

  • 推模型:主題對象向觀察者推主題的詳細信息,不管觀察者是否需要,推送的信息通暢是主題對象的全部或者部分

  • 拉模型:主題對象在通知觀察者的時候,只傳遞少量信息。如果觀察者需要更具體的信息,由觀察者主動到主題對象中獲取,相當是觀察者從主題中拉對象數據。一般這種模型的實現,會包主題對象通過update方法傳遞給觀察者,這樣在觀察者需要獲取數據的時候,就可以通過這個引用獲取。

注意: 就是是否把整體傳遞給觀察者

1.5 代碼實現

1.抽象subject

觀察者模式

2.具體實現 concreteSubject

觀察者模式

3.抽象observer

觀察模式抽象類

4.具體的observer

觀察模式具體實現類

5.調用方法

調用

1.6 android源碼中的實現

BaseAdapter

1.抽象觀察者

抽象觀察者
observable

2.具體實現observer

觀察者集合

3.真正的抽象觀察者

抽象觀察者

4.其他需要關鍵適配的都可以繼承這個類

5.以ListView的setAdapter為例。

ListView

6.AdapterDataSetObserver 在ListView父類AbsListView中定義

image.png

AdapterDataSetObserver是繼承DataSetObserver并實現了。

image.png

8.流程

流程

在RecyclerView中原理是一樣的

  • 1.在swapAdapter(Adapter adapter, boolean removeAndRecycleExistingViews)中 adapter是Adapter<VH extends ViewHolder>。
  • 2.在其中定義了一個抽象被觀察者AdapterDataObservable mObservable = new AdapterDataObservable() 這個被觀察者繼承AdapterDataObservable extends Observable<AdapterDataObserver>。
  • 3.AdapterDataObserver 就是抽象觀察者
  • 4.RecyclerViewDataObserver是具體的觀察者

2.備忘錄模式

2.1 定義

在不破壞封閉的前提下,捕獲一個對象的內部狀態,并在該對象之外保存這個狀態,這樣,以后就可將該對象恢復到原先保存的狀態。

2.2 UML

備忘錄模式

提供比較完備的操作狀態的方法,我們稱它為寬接口;而另一個則可以只是一個標示,我們稱它為窄接口。

備忘錄角色對任何對象都提供一個接口,即寬接口,備忘錄角色的內部所存儲的狀態就對所有對象公開。因此這個實現又叫做“白盒實現”。

“白盒”實現將發起人角色的狀態存儲在一個大家都看得到的地方,因此是破壞封裝性的。但是通過程序員自律,同樣可以在一定程度上實現模式的大部分用意。因此白箱實現仍然是有意義的。

備忘錄角色對發起人(Originator)角色對象提供一個寬接口,而為其他對象提供一個窄接口。這樣的實現叫做“黑盒實現”。

  • Originator:負責創建一個備忘錄,可以記錄和恢復自身的內部狀態
  • Memento:備忘錄角色,用于存儲originator的內部狀態,并且可以防止originator之外的Memento訪問
  • Careaker:負責 存儲備忘錄,不能對備忘錄的內容進行操作和訪問,只能將備忘錄傳遞給其他對象。

2.3 代碼實現

A.白盒

1.創建備忘角色

備忘錄模式--備忘錄

2.創建originator負責對數據的操作(保存和恢復)

備忘錄模式--originator

3.創建Caretaker 負責對備忘錄數據的存儲和獲得

備忘錄模式--caretaker

4.調用

備忘錄模式--調用

B.黑盒實現

1.創建備忘錄memento 空接口,具體的實現在Originator中

public interface MementoIF {
 
}

2.創建Originator

備忘錄模式--Originator

3.創建 caretaker

備忘錄模式--caretaker

4.調用

備忘錄模式--調用

2.4 android源碼中的使用

activity中的onSaveInstanceState()

android中的備忘錄

在這個過程中,activity扮演了Caretaker角色,負責存儲,恢復UI的狀態信息;Activity,Fragment,view,viewgroup等對象為originator角色,也就是需要存儲狀態的對象;Memoto則由Bundle類扮演。Activity在停止之前會根據Activity的退出情景來選擇是否需要存儲狀態,在重啟Activity時會判斷ActivityClientRecord對象中是否存儲了Activity的狀態,如果含有則調用onRestoreInstanceState函數,從而使得Activity的UI效果與上次保持一致。

onSaveInstanceState的調用時機:

  1. 當用戶按下home鍵
  2. 長按home鍵,選擇其他的程序時
  3. 按下電源鍵關閉屏幕時
  4. activity中啟動一個新的Activity時
  5. 屏幕方向切換時,如果從豎屏切換到橫屏時
  6. 電話打入等情況時
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 面向對象的六大原則 單一職責原則 所謂職責是指類變化的原因。如果一個類有多于一個的動機被改變,那么這個類就具有多于...
    JxMY閱讀 973評論 1 3
  • 1 場景問題# 1.1 開發仿真系統## 考慮這樣一個仿真應用,功能是:模擬運行針對某個具體問題的多個解決方案,記...
    七寸知架構閱讀 2,184評論 1 50
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,422評論 25 708
  • 設計模式匯總 一、基礎知識 1. 設計模式概述 定義:設計模式(Design Pattern)是一套被反復使用、多...
    MinoyJet閱讀 3,979評論 1 15
  • 今年的娛樂圈可謂火爆極了,王寶強,李丹以及昨日的何潔,不同于前兩者也不同于之前的馬伊琍,何潔爆出了: 沉默,因為不...
    柳桃小姐閱讀 197評論 0 1