Android中MVVM架構(gòu)

分層思想

分層是一種思想,同時(shí)也是一種架構(gòu)模式摧玫。它的特點(diǎn)是專職,即某一層的職責(zé)是相同的绑青、確定的诬像;比如我們平時(shí)所謂的Dao屋群、Controller層…他們都有明確的職責(zé)。

分層架構(gòu)雖說不能完完全全的解決項(xiàng)目程序復(fù)雜度高的問題坏挠,但是通過分層芍躏,將大的問題抽象分解成了小的功能面,局部化在每一層中降狠,這樣就有效的降低了單個(gè)問題的規(guī)模和復(fù)雜度对竣;另外層與層之間也可以通過簡單的調(diào)整插入新的層面,用以滿足不斷變化的需求喊熟,同一層面來說也可近乎0成本的水平擴(kuò)展柏肪;并且易于Debug、測試芥牌。

什么是MVC/MVP ?

MVC實(shí)際上是一種分層思想的踐行者和改進(jìn)者聂使,在GUI編程中壁拉,MVC已經(jīng)有幾十年的歷史了。
顧名思義M(Model)即數(shù)據(jù)模型層柏靶,Model層很有意思弃理,對于服務(wù)端編程來說我們把MVC中的M極有可能是包括了業(yè)務(wù)處理(Service)和實(shí)體類的,對于客戶端編程來說MVC中的M可能就僅僅是數(shù)據(jù)模型屎蜓,當(dāng)然以上的說法只是于我個(gè)人而言的體會(huì)痘昌,不代表廣義立場。
V(View)即視圖層/表現(xiàn)層炬转,主要負(fù)責(zé)數(shù)據(jù)的展示和用戶的交互辆苔,C(Controller)即控制層,主要負(fù)責(zé)一些數(shù)據(jù)傳遞扼劈、請求轉(zhuǎn)發(fā)驻啤、業(yè)務(wù)處理的委派。
以上是標(biāo)準(zhǔn)意義上的MVC荐吵,對于Android來說:
Model:數(shù)據(jù)模型(實(shí)體類骑冗、持久化、IO)
View:布局文件
Controller:對應(yīng)于Activity先煎、Fragment贼涩,包含一些業(yè)務(wù)邏輯的處理
這里我們會(huì)發(fā)現(xiàn),Android的MVC事實(shí)上V層的職責(zé)一部分被C層承擔(dān)了薯蝎,比如一些交互我們必須寫到Activity/Fragment中遥倦,這樣就會(huì)導(dǎo)致C層既包含UI操作,又有網(wǎng)絡(luò)請求良风、業(yè)務(wù)處理等谊迄;導(dǎo)致C層過于臃腫闷供,不利于項(xiàng)目后期的維護(hù)和擴(kuò)展。

所以统诺,MVP就應(yīng)運(yùn)而生了歪脏,MVP實(shí)際上是由MVC進(jìn)化而來,它比較好的解決了MVC時(shí)代遺留的問題粮呢,MVP中的各層含義:
Model:數(shù)據(jù)模型(實(shí)體類婿失、持久化、IO)
View:Activity/Fragment和布局文件
Presenter:負(fù)責(zé)完成View和Model之間的交互和業(yè)務(wù)邏輯
其核心是:設(shè)計(jì)一個(gè)抽象的V層接口啄寡,并由具體的View實(shí)現(xiàn)該接口溜嗜,P層內(nèi)部維護(hù)一個(gè)該接口的實(shí)例引用澳盐,一般在構(gòu)造函數(shù)中傳遞進(jìn)來復(fù)制(即View層初始化P層實(shí)例時(shí)),彼時(shí)P層即可通過調(diào)用該接口來完成對View層的操作,V層也因持有P層實(shí)例,可以進(jìn)行業(yè)務(wù)邏輯處理委派瑞凑。

MVVM是什么,與MVC/MVP有何區(qū)別 搭盾?

MVVM是對MVP/MVC的一種改進(jìn)祷蝌,既解決了MVC時(shí)代的職責(zé)不明的問題,也很好的解決了MVP模式中需要編寫過多繁瑣的接口痴昧,以及V層和P層互相依賴所產(chǎn)生的一些隱式問題稽穆。

在MVVM中,各層含義如下
Model:數(shù)據(jù)模型(實(shí)體類赶撰、持久化舌镶、IO)
View:Activity/Fragment和布局文件
ViewModel:業(yè)務(wù)邏輯的處理、數(shù)據(jù)的轉(zhuǎn)換豪娜、連接M層和V層的橋梁
看上去似乎和MVP中各層的職責(zé)是類似的餐胀,并沒有顯著的不同和改進(jìn);那么我們?yōu)楹我褂肕VVM架構(gòu)呢侵歇?

  • 雙向綁定骂澄、數(shù)據(jù)驅(qū)動(dòng)
    在常規(guī)的開發(fā)模式中,數(shù)據(jù)變化需要更新UI的時(shí)候惕虑,需要先獲取UI控件的引用坟冲,然后再更新UI。獲取用戶的輸入和操作也需要通過UI控件的引用溃蔫。在MVVM中健提,這些都是通過數(shù)據(jù)驅(qū)動(dòng)來自動(dòng)完成的,數(shù)據(jù)變化后會(huì)自動(dòng)更新UI伟叛,UI的改變也能自動(dòng)反饋到數(shù)據(jù)層私痹,數(shù)據(jù)成為主導(dǎo)因素。這樣MVVM層在業(yè)務(wù)邏輯處理中只要關(guān)心數(shù)據(jù),不需要直接和UI打交道紊遵,在業(yè)務(wù)處理過程中簡單方便很多账千。
  • 高度解耦
    MVVM模式中,數(shù)據(jù)是獨(dú)立于UI的暗膜。
    數(shù)據(jù)和業(yè)務(wù)邏輯處于一個(gè)獨(dú)立的ViewModel中匀奏,ViewModel只需要關(guān)注數(shù)據(jù)和業(yè)務(wù)邏輯,不需要和UI或者控件打交道学搜。UI想怎么處理數(shù)據(jù)都由UI自己決定娃善,ViewModel不涉及任何和UI相關(guān)的事,也不持有UI控件的引用瑞佩。即便是控件改變了(比如:TextView換成EditText)聚磺,ViewModel也幾乎不需要更改任何代碼。它非常完美的解耦了View層和ViewModel炬丸,解決了上面我們所說的MVP的痛點(diǎn)瘫寝。
  • 可復(fù)用、易測試稠炬、方便協(xié)同開發(fā)
    一個(gè)ViewModel可以復(fù)用到多個(gè)View中矢沿。同樣的一份數(shù)據(jù),可以提供給不同的UI去做展示酸纲。對于版本迭代中頻繁的UI改動(dòng),更新或新增一套View即可瑟匆。如果想在UI上做A/B Testing闽坡,那MVVM是你不二選擇。
    MVVM的分工是非常明顯的愁溜,由于View和ViewModel之間是松散耦合的:一個(gè)是處理業(yè)務(wù)和數(shù)據(jù)疾嗅、一個(gè)是專門的UI處理。所以冕象,完全由兩個(gè)人分工來做代承,一個(gè)做UI(XML和Activity)一個(gè)寫ViewModel,效率更高
    ViewModel層做的事是數(shù)據(jù)處理和業(yè)務(wù)邏輯渐扮,View層中關(guān)注的是UI论悴,兩者完全沒有依賴。不管是UI的單元測試還是業(yè)務(wù)邏輯的單元測試墓律,都是低耦合的膀估。在MVVM中數(shù)據(jù)是直接綁定到UI控件上的(部分?jǐn)?shù)據(jù)是可以直接反映出UI上的內(nèi)容),那么我們就可以直接通過修改綁定的數(shù)據(jù)源來間接做一些Android UI上的測試耻讽。

Android Architecture Components(架構(gòu)組件)

實(shí)現(xiàn)MVVM的方式和工具有很多察纯,既可以使用Google在2015年推出的DataBinding庫,亦或是其他。也可以選擇Google IO 2017 推出的Android Architecture Components即架構(gòu)組件饼记,這也是本文所采用的解決方案香伴。

包含以下組件:

  • 生命周期管理庫 - Lifecycle
    • Lifecycle組件,為下面兩個(gè)組件提供了生命周期感知的基礎(chǔ)
    • LiveData組件具则,可觀測的即纲、可感知生命周期的數(shù)據(jù)
    • ViewModel組件,不依賴于View乡洼、提供UI數(shù)據(jù)崇裁、橋接持久層、業(yè)務(wù)邏輯
  • 數(shù)據(jù)持久化庫 - Room束昵,Sqlite的ORM
    事實(shí)上拔稳,Architecture Components實(shí)現(xiàn)了一個(gè)比較理想化的依賴方式,自上而下锹雏,單項(xiàng)依賴巴比;VM層并不持有View層的任何引用,但卻是生命周期感知的礁遵,在新版的AS中View也不用去實(shí)現(xiàn)某些接口或繼承特定的類轻绞,AppCompatActivity已經(jīng)幫你整合了這一切。另外佣耐,關(guān)于Repository的解釋政勃,它并不是架構(gòu)組件的成員,但是Google推薦引用Repository層兼砖,來作為我們唯一的數(shù)據(jù)來源接口奸远,我們從圖中也很好理解,他的職責(zé)就是使VM層對數(shù)據(jù)來源是無感知的讽挟,包裝了數(shù)據(jù)來源懒叛,提供統(tǒng)一的API,供上層透明化的調(diào)用耽梅。
    demo下期提供 到此為止薛窥。告辭
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市眼姐,隨后出現(xiàn)的幾起案子诅迷,更是在濱河造成了極大的恐慌,老刑警劉巖妥凳,帶你破解...
    沈念sama閱讀 222,378評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件竟贯,死亡現(xiàn)場離奇詭異,居然都是意外死亡逝钥,警方通過查閱死者的電腦和手機(jī)屑那,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,970評論 3 399
  • 文/潘曉璐 我一進(jìn)店門拱镐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人持际,你說我怎么就攤上這事沃琅。” “怎么了蜘欲?”我有些...
    開封第一講書人閱讀 168,983評論 0 362
  • 文/不壞的土叔 我叫張陵益眉,是天一觀的道長。 經(jīng)常有香客問我姥份,道長郭脂,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,938評論 1 299
  • 正文 為了忘掉前任澈歉,我火速辦了婚禮展鸡,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘埃难。我一直安慰自己莹弊,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,955評論 6 398
  • 文/花漫 我一把揭開白布涡尘。 她就那樣靜靜地躺著忍弛,像睡著了一般。 火紅的嫁衣襯著肌膚如雪考抄。 梳的紋絲不亂的頭發(fā)上细疚,一...
    開封第一講書人閱讀 52,549評論 1 312
  • 那天,我揣著相機(jī)與錄音川梅,去河邊找鬼惠昔。 笑死,一個(gè)胖子當(dāng)著我的面吹牛挑势,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播啦鸣,決...
    沈念sama閱讀 41,063評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼潮饱,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了诫给?” 一聲冷哼從身側(cè)響起香拉,我...
    開封第一講書人閱讀 39,991評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎中狂,沒想到半個(gè)月后凫碌,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,522評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡胃榕,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,604評論 3 342
  • 正文 我和宋清朗相戀三年盛险,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,742評論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡苦掘,死狀恐怖换帜,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情鹤啡,我是刑警寧澤惯驼,帶...
    沈念sama閱讀 36,413評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站递瑰,受9級特大地震影響祟牲,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜抖部,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,094評論 3 335
  • 文/蒙蒙 一说贝、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧您朽,春花似錦狂丝、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,572評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至讯屈,卻和暖如春蛋哭,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背涮母。 一陣腳步聲響...
    開封第一講書人閱讀 33,671評論 1 274
  • 我被黑心中介騙來泰國打工谆趾, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人叛本。 一個(gè)月前我還...
    沈念sama閱讀 49,159評論 3 378
  • 正文 我出身青樓沪蓬,卻偏偏與公主長得像,于是被迫代替她去往敵國和親来候。 傳聞我的和親對象是個(gè)殘疾皇子跷叉,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,747評論 2 361

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