1.觀察者模式
1.1 定義
定義對(duì)象間一種一對(duì)多的依賴關(guān)系过椎,使得每當(dāng)一個(gè)對(duì)象改變狀態(tài),則所有依賴于它的對(duì)象得到通知并被自動(dòng)更新疚宇。
1.2 UML
說明:
- 1.subject 抽象主題,也就是被觀察(observable)角色敷待,抽象主題角色把所有觀察者對(duì)象引用到一個(gè)集合
- 2.concteteSubject:具體主題,該角色將有關(guān)狀態(tài)存入具體觀察者對(duì)象,在具體主題的內(nèi)部狀態(tài)發(fā)送改變時(shí)榜揖,通知注冊(cè)過觀察者發(fā)出通知,也叫具體被觀察者举哟。
- 3.observer:抽象觀察者,該角色是觀察者的抽象類炎滞,它定義了一個(gè)更新接口册赛,使得在得到主題更改時(shí)更新自己
- 4.concreteObserver:具體的觀察者。
1.3.使用場(chǎng)景
- 1.關(guān)聯(lián)行為場(chǎng)景牡属,需要注意的是關(guān)聯(lián)行為是可以分拆的扼睬,而不是組合關(guān)系
- 2.事件多級(jí)觸發(fā)場(chǎng)景
- 3.跨系統(tǒng)的消息交換場(chǎng)景窗宇,如消息隊(duì)列措伐,事件總線的處理機(jī)制
1.4 兩種模式
推模型:主題對(duì)象向觀察者推主題的詳細(xì)信息军俊,不管觀察者是否需要,推送的信息通暢是主題對(duì)象的全部或者部分
拉模型:主題對(duì)象在通知觀察者的時(shí)候担败,只傳遞少量信息。如果觀察者需要更具體的信息提前,由觀察者主動(dòng)到主題對(duì)象中獲取泳唠,相當(dāng)是觀察者從主題中拉對(duì)象數(shù)據(jù)。一般這種模型的實(shí)現(xiàn)拓哺,會(huì)包主題對(duì)象通過update方法傳遞給觀察者,這樣在觀察者需要獲取數(shù)據(jù)的時(shí)候窥摄,就可以通過這個(gè)引用獲取础淤。
注意: 就是是否把整體傳遞給觀察者
1.5 代碼實(shí)現(xiàn)
1.抽象subject
2.具體實(shí)現(xiàn) concreteSubject
3.抽象observer
4.具體的observer
5.調(diào)用方法
1.6 android源碼中的實(shí)現(xiàn)
BaseAdapter
1.抽象觀察者
2.具體實(shí)現(xiàn)observer
3.真正的抽象觀察者
4.其他需要關(guān)鍵適配的都可以繼承這個(gè)類
5.以ListView的setAdapter為例玻侥。
6.AdapterDataSetObserver 在ListView父類AbsListView中定義
AdapterDataSetObserver是繼承DataSetObserver并實(shí)現(xiàn)了。
8.流程
在RecyclerView中原理是一樣的
- 1.在swapAdapter(Adapter adapter, boolean removeAndRecycleExistingViews)中 adapter是Adapter<VH extends ViewHolder>掌桩。
- 2.在其中定義了一個(gè)抽象被觀察者AdapterDataObservable mObservable = new AdapterDataObservable() 這個(gè)被觀察者繼承AdapterDataObservable extends Observable<AdapterDataObserver>姑食。
- 3.AdapterDataObserver 就是抽象觀察者
- 4.RecyclerViewDataObserver是具體的觀察者
2.備忘錄模式
2.1 定義
在不破壞封閉的前提下波岛,捕獲一個(gè)對(duì)象的內(nèi)部狀態(tài)音半,并在該對(duì)象之外保存這個(gè)狀態(tài)曹鸠,這樣,以后就可將該對(duì)象恢復(fù)到原先保存的狀態(tài)坛善。
2.2 UML
提供比較完備的操作狀態(tài)的方法叛薯,我們稱它為寬接口耗溜;而另一個(gè)則可以只是一個(gè)標(biāo)示省容,我們稱它為窄接口。
備忘錄角色對(duì)任何對(duì)象都提供一個(gè)接口阿宅,即寬接口,備忘錄角色的內(nèi)部所存儲(chǔ)的狀態(tài)就對(duì)所有對(duì)象公開洒放。因此這個(gè)實(shí)現(xiàn)又叫做“白盒實(shí)現(xiàn)”。
“白盒”實(shí)現(xiàn)將發(fā)起人角色的狀態(tài)存儲(chǔ)在一個(gè)大家都看得到的地方往湿,因此是破壞封裝性的。但是通過程序員自律他膳,同樣可以在一定程度上實(shí)現(xiàn)模式的大部分用意。因此白箱實(shí)現(xiàn)仍然是有意義的棕孙。
備忘錄角色對(duì)發(fā)起人(Originator)角色對(duì)象提供一個(gè)寬接口些膨,而為其他對(duì)象提供一個(gè)窄接口。這樣的實(shí)現(xiàn)叫做“黑盒實(shí)現(xiàn)”欧漱。
- Originator:負(fù)責(zé)創(chuàng)建一個(gè)備忘錄葬燎,可以記錄和恢復(fù)自身的內(nèi)部狀態(tài)
- Memento:備忘錄角色,用于存儲(chǔ)originator的內(nèi)部狀態(tài)窑邦,并且可以防止originator之外的Memento訪問
- Careaker:負(fù)責(zé) 存儲(chǔ)備忘錄冈钦,不能對(duì)備忘錄的內(nèi)容進(jìn)行操作和訪問李请,只能將備忘錄傳遞給其他對(duì)象。
2.3 代碼實(shí)現(xiàn)
A.白盒
1.創(chuàng)建備忘角色
2.創(chuàng)建originator負(fù)責(zé)對(duì)數(shù)據(jù)的操作(保存和恢復(fù))
3.創(chuàng)建Caretaker 負(fù)責(zé)對(duì)備忘錄數(shù)據(jù)的存儲(chǔ)和獲得
4.調(diào)用
B.黑盒實(shí)現(xiàn)
1.創(chuàng)建備忘錄memento 空接口较幌,具體的實(shí)現(xiàn)在Originator中
public interface MementoIF {
}
2.創(chuàng)建Originator
3.創(chuàng)建 caretaker
4.調(diào)用
2.4 android源碼中的使用
activity中的onSaveInstanceState()
在這個(gè)過程中乍炉,activity扮演了Caretaker角色绢片,負(fù)責(zé)存儲(chǔ)岛琼,恢復(fù)UI的狀態(tài)信息;Activity熙涤,F(xiàn)ragment困檩,view,viewgroup等對(duì)象為originator角色茸歧,也就是需要存儲(chǔ)狀態(tài)的對(duì)象显沈;Memoto則由Bundle類扮演。Activity在停止之前會(huì)根據(jù)Activity的退出情景來選擇是否需要存儲(chǔ)狀態(tài)涤浇,在重啟Activity時(shí)會(huì)判斷ActivityClientRecord對(duì)象中是否存儲(chǔ)了Activity的狀態(tài)魔慷,如果含有則調(diào)用onRestoreInstanceState函數(shù)院尔,從而使得Activity的UI效果與上次保持一致。
onSaveInstanceState的調(diào)用時(shí)機(jī):
- 當(dāng)用戶按下home鍵
- 長(zhǎng)按home鍵纵顾,選擇其他的程序時(shí)
- 按下電源鍵關(guān)閉屏幕時(shí)
- activity中啟動(dòng)一個(gè)新的Activity時(shí)
- 屏幕方向切換時(shí)栋盹,如果從豎屏切換到橫屏?xí)r
- 電話打入等情況時(shí)