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

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

觀察模式具體實(shí)現(xiàn)類

5.調(diào)用方法

調(diào)用

1.6 android源碼中的實(shí)現(xiàn)

BaseAdapter

1.抽象觀察者

抽象觀察者
observable

2.具體實(shí)現(xiàn)observer

觀察者集合

3.真正的抽象觀察者

抽象觀察者

4.其他需要關(guān)鍵適配的都可以繼承這個(gè)類

5.以ListView的setAdapter為例玻侥。

ListView

6.AdapterDataSetObserver 在ListView父類AbsListView中定義

image.png

AdapterDataSetObserver是繼承DataSetObserver并實(shí)現(xiàn)了。

image.png

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ù))

備忘錄模式--originator

3.創(chuàng)建Caretaker 負(fù)責(zé)對(duì)備忘錄數(shù)據(jù)的存儲(chǔ)和獲得

備忘錄模式--caretaker

4.調(diào)用

備忘錄模式--調(diào)用

B.黑盒實(shí)現(xiàn)

1.創(chuàng)建備忘錄memento 空接口较幌,具體的實(shí)現(xiàn)在Originator中

public interface MementoIF {
 
}

2.創(chuàng)建Originator

備忘錄模式--Originator

3.創(chuàng)建 caretaker

備忘錄模式--caretaker

4.調(diào)用

備忘錄模式--調(diào)用

2.4 android源碼中的使用

activity中的onSaveInstanceState()

android中的備忘錄

在這個(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ī):

  1. 當(dāng)用戶按下home鍵
  2. 長(zhǎng)按home鍵纵顾,選擇其他的程序時(shí)
  3. 按下電源鍵關(guān)閉屏幕時(shí)
  4. activity中啟動(dòng)一個(gè)新的Activity時(shí)
  5. 屏幕方向切換時(shí)栋盹,如果從豎屏切換到橫屏?xí)r
  6. 電話打入等情況時(shí)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末例获,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子蠕搜,更是在濱河造成了極大的恐慌件余,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,252評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件旬渠,死亡現(xiàn)場(chǎng)離奇詭異端壳,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)损谦,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,886評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門照捡,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人闯参,你說我怎么就攤上這事悲立⌒较Γ” “怎么了?”我有些...
    開封第一講書人閱讀 168,814評(píng)論 0 361
  • 文/不壞的土叔 我叫張陵馏慨,是天一觀的道長(zhǎng)姑隅。 經(jīng)常有香客問我,道長(zhǎng)樟澜,這世上最難降的妖魔是什么叮盘? 我笑而不...
    開封第一講書人閱讀 59,869評(píng)論 1 299
  • 正文 為了忘掉前任柔吼,我火速辦了婚禮,結(jié)果婚禮上觅玻,老公的妹妹穿的比我還像新娘溪厘。我一直安慰自己畸悬,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,888評(píng)論 6 398
  • 文/花漫 我一把揭開白布披粟。 她就那樣靜靜地躺著守屉,像睡著了一般蒿辙。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上碰镜,一...
    開封第一講書人閱讀 52,475評(píng)論 1 312
  • 那天习瑰,我揣著相機(jī)與錄音甜奄,去河邊找鬼。 笑死课兄,一個(gè)胖子當(dāng)著我的面吹牛烟阐,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播蜒茄,決...
    沈念sama閱讀 41,010評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼檀葛,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼屿聋!你這毒婦竟也來了藏鹊?” 一聲冷哼從身側(cè)響起盘寡,我...
    開封第一講書人閱讀 39,924評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤宴抚,失蹤者是張志新(化名)和其女友劉穎甫煞,沒想到半個(gè)月后冠绢,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,469評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡楷力,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,552評(píng)論 3 342
  • 正文 我和宋清朗相戀三年萧朝,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了检柬。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片竖配。...
    茶點(diǎn)故事閱讀 40,680評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖用爪,靈堂內(nèi)的尸體忽然破棺而出胁镐,到底是詐尸還是另有隱情,我是刑警寧澤烁巫,帶...
    沈念sama閱讀 36,362評(píng)論 5 351
  • 正文 年R本政府宣布亚隙,位于F島的核電站违崇,受9級(jí)特大地震影響诊霹,放射性物質(zhì)發(fā)生泄漏渣淳。R本人自食惡果不足惜入愧,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,037評(píng)論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望怔蚌。 院中可真熱鬧旁赊,春花似錦、人聲如沸籍胯。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,519評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至子寓,卻和暖如春笋除,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背鲜屏。 一陣腳步聲響...
    開封第一講書人閱讀 33,621評(píng)論 1 274
  • 我被黑心中介騙來泰國打工国拇, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留酱吝,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,099評(píng)論 3 378
  • 正文 我出身青樓忆嗜,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國和親闪湾。 傳聞我的和親對(duì)象是個(gè)殘疾皇子绩卤,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,691評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容

  • 面向?qū)ο蟮牧笤瓌t 單一職責(zé)原則 所謂職責(zé)是指類變化的原因濒憋。如果一個(gè)類有多于一個(gè)的動(dòng)機(jī)被改變,那么這個(gè)類就具有多于...
    JxMY閱讀 948評(píng)論 1 3
  • 1 場(chǎng)景問題# 1.1 開發(fā)仿真系統(tǒng)## 考慮這樣一個(gè)仿真應(yīng)用律适,功能是:模擬運(yùn)行針對(duì)某個(gè)具體問題的多個(gè)解決方案,記...
    七寸知架構(gòu)閱讀 2,150評(píng)論 1 50
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,310評(píng)論 25 707
  • 設(shè)計(jì)模式匯總 一纠修、基礎(chǔ)知識(shí) 1. 設(shè)計(jì)模式概述 定義:設(shè)計(jì)模式(Design Pattern)是一套被反復(fù)使用扣草、多...
    MinoyJet閱讀 3,949評(píng)論 1 15
  • 今年的娛樂圈可謂火爆極了密浑,王寶強(qiáng)粗井,李丹以及昨日的何潔,不同于前兩者也不同于之前的馬伊琍懒构,何潔爆出了: 沉默耘擂,因?yàn)椴?..
    柳桃小姐閱讀 189評(píng)論 0 1