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.抽象觀察者
2.具體實現observer
3.真正的抽象觀察者
4.其他需要關鍵適配的都可以繼承這個類
5.以ListView的setAdapter為例。
6.AdapterDataSetObserver 在ListView父類AbsListView中定義
AdapterDataSetObserver是繼承DataSetObserver并實現了。
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負責對數據的操作(保存和恢復)
3.創建Caretaker 負責對備忘錄數據的存儲和獲得
4.調用
B.黑盒實現
1.創建備忘錄memento 空接口,具體的實現在Originator中
public interface MementoIF {
}
2.創建Originator
3.創建 caretaker
4.調用
2.4 android源碼中的使用
activity中的onSaveInstanceState()
在這個過程中,activity扮演了Caretaker角色,負責存儲,恢復UI的狀態信息;Activity,Fragment,view,viewgroup等對象為originator角色,也就是需要存儲狀態的對象;Memoto則由Bundle類扮演。Activity在停止之前會根據Activity的退出情景來選擇是否需要存儲狀態,在重啟Activity時會判斷ActivityClientRecord對象中是否存儲了Activity的狀態,如果含有則調用onRestoreInstanceState函數,從而使得Activity的UI效果與上次保持一致。
onSaveInstanceState的調用時機:
- 當用戶按下home鍵
- 長按home鍵,選擇其他的程序時
- 按下電源鍵關閉屏幕時
- activity中啟動一個新的Activity時
- 屏幕方向切換時,如果從豎屏切換到橫屏時
- 電話打入等情況時