首頁(yè)技術(shù)文章正文

Android培訓(xùn)之初探mvvm框架設(shè)計(jì)(上)

更新時(shí)間:2017-04-14 來(lái)源:黑馬程序員Android培訓(xùn)學(xué)院 瀏覽量:

初探安卓MVVM框架設(shè)計(jì)

一. 什么是MVVM?
MVVM是近幾年流行的一種設(shè)計(jì)框架,基于該框架設(shè)計(jì)的應(yīng)用程序具有良好的解耦和可擴(kuò)展性,大幅降低了維護(hù)成本,提高了程序員的開發(fā)效率.在了解MVVM框架之前,我們有必要回顧一下其他設(shè)計(jì)框架.

1. MVC模式MVC模式的意思是,軟件可以分成三個(gè)部分.
視圖(View):用戶界面
控制器(Controller):業(yè)務(wù)邏輯
模型(Model):數(shù)據(jù)保存
1.View傳送指令到Controller
2.Controller完成業(yè)務(wù)邏輯后,要求Model改變狀態(tài)
3.Model將新的數(shù)據(jù)發(fā)送到View,用戶得到反饋
所有通信都是單向的.我們傳統(tǒng)的Android開發(fā)都是基于這種模式.每一層可以代表我們常用的如下組件:
Model層: sqlite數(shù)據(jù)庫(kù), JavaBean, SharedPreference, sdcard,獲取網(wǎng)絡(luò)數(shù)據(jù)的api等
View層: xml布局文件,自定義控件等
Controller層: Activity等
此處需要注意的是,在傳統(tǒng)的MVC設(shè)計(jì)模式中,
Activity屬于Controller層而不是View層,因?yàn)锳ctivity即承擔(dān)了數(shù)據(jù)調(diào)用,也承擔(dān)了界面展示,相當(dāng)于View和Model中間的協(xié)調(diào)器.很多初學(xué)者都會(huì)誤認(rèn)為Activity屬于View層.當(dāng)然,這種說(shuō)法僅限用MVC模式,換做其他模式就不一定了!

2.  MVP模式MVC模式普及了一段時(shí)間之后,逐漸暴露出一些問題.比如我們發(fā)現(xiàn),
Activity中寫的代碼太多,有時(shí)候一個(gè)Activity甚至達(dá)到了四五千行代碼,維護(hù)起來(lái)極為不便.原因也很明顯,就是Activity既參與api訪問和數(shù)據(jù)調(diào)用,又參與了界面的更新,職能劃分不明確,沒有完全實(shí)現(xiàn)解耦.我們的想法是,能不能讓Activity只做界面響應(yīng)和更新,其他業(yè)務(wù)邏輯全部由另外一個(gè)單獨(dú)模塊來(lái)完成?于是MVP誕生了.
MVP模式將Controller改名為Presenter,同時(shí)改變了通信方向.
1.各部分之間的通信,都是雙向的.
2.View與Model不發(fā)生聯(lián)系,都通過(guò)Presenter傳遞.
3.View非常薄,不部署任何業(yè)務(wù)邏輯,稱為"被動(dòng)視圖"(Passive View),即沒有任何主動(dòng)性,而Presenter非常厚,所有邏輯都部署在那里.
當(dāng)這樣調(diào)整了之后, Activity就純粹屬于View層了,所有業(yè)務(wù)邏輯全由Presenter來(lái)完成.當(dāng)View界面被用戶操作時(shí)(比如按鈕點(diǎn)擊), View層就會(huì)調(diào)用Presenter完成相關(guān)業(yè)務(wù)邏輯,而Presenter完成了之后,就會(huì)將結(jié)果以回調(diào)的形式傳遞給View層,由View層完成界面刷新.具體代碼如何實(shí)現(xiàn)我就不多說(shuō)了,因?yàn)槲覀兘裉斓闹攸c(diǎn)是MVVM

3. MVVM模式當(dāng)我們采用MVP模式之后,發(fā)現(xiàn)Activity幾乎沒啥事可做了,我們的項(xiàng)目代碼層級(jí)也清晰了,也好維護(hù)了.但是MVP也有缺點(diǎn),比如,為了實(shí)現(xiàn)MVP,我們需要額外增加好多接口和類,比如,一個(gè)Activity需要對(duì)應(yīng)一個(gè)Presenter類和Presenter接口,同時(shí)為了方便Activity和Presenter進(jìn)行通信,還得再定義一個(gè)回調(diào)接口IView,也就是說(shuō),每一個(gè)Activity都需要額外增加兩個(gè)接口和一個(gè)類,無(wú)疑提高了代碼量.而MVVM的誕生,就解決了這個(gè)問題!
MVVM模式將Presenter改名為ViewModel,基本上與MVP模式完全一致.
唯一的區(qū)別是,它采用雙向綁定(data-binding):View的變動(dòng),自動(dòng)反映在ViewModel,反之亦然.
有沒有注意到, MVVM和MVP幾乎是一樣的,唯一的不同就在于View和ViewModel之間的那根線, MVP是兩根,表示View調(diào)用Presenter執(zhí)行邏輯,Presenter調(diào)用View來(lái)返回?cái)?shù)據(jù),更新界面;MVVM中只有一根線兩個(gè)箭頭,代表的是View和ViewModel雙向綁定,自動(dòng)同步數(shù)據(jù),無(wú)需手動(dòng)調(diào)用相關(guān)方法進(jìn)行通信,從而減少了代碼量.而這種雙向綁定的機(jī)制,都?xì)w功于谷歌推出的DataBinding的新功能.下面我們來(lái)研究一下到底什么是DataBinding.

本文版權(quán)歸黑馬程序員Android培訓(xùn)學(xué)院所有,歡迎轉(zhuǎn)載,轉(zhuǎn)載請(qǐng)注明作者出處。謝謝!
作者:黑馬程序員Android培訓(xùn)學(xué)院
首發(fā):http://android.itheima.com/
分享到:
在線咨詢 我要報(bào)名
和我們?cè)诰€交談!