初探安卓MVVM框架設計
一. 什么是MVVM?MVVM是近幾年流行的一種設計框架,基于該框架設計的應用程序具有良好的解耦和可擴展性,大幅降低了維護成本,提高了程序員的開發(fā)效率.在了解MVVM框架之前,我們有必要回顧一下其他設計框架.
1. MVC模式MVC模式的意思是,軟件可以分成三個部分.
視圖(View):用戶界面
控制器(Controller):業(yè)務邏輯
模型(Model):數(shù)據(jù)保存
各部分之間的通信方式如下.
1.View傳送指令到Controller
2.Controller完成業(yè)務邏輯后,要求Model改變狀態(tài)
3.Model將新的數(shù)據(jù)發(fā)送到View,用戶得到反饋
所有通信都是單向的.我們傳統(tǒng)的Android開發(fā)都是基于這種模式.每一層可以代表我們常用的如下組件:
Model層: sqlite數(shù)據(jù)庫, JavaBean, SharedPreference, sdcard,獲取網(wǎng)絡數(shù)據(jù)的api等
View層: xml布局文件,自定義控件等
Controller層: Activity等
此處需要注意的是,在傳統(tǒng)的MVC設計模式中,
Activity屬于Controller層而不是View層,因為Activity即承擔了數(shù)據(jù)調(diào)用,也承擔了界面展示,相當于View和Model中間的協(xié)調(diào)器.很多初學者都會誤認為Activity屬于View層.當然,這種說法僅限用MVC模式,換做其他模式就不一定了!
2. MVP模式MVC模式普及了一段時間之后,逐漸暴露出一些問題.比如我們發(fā)現(xiàn),
Activity中寫的代碼太多,有時候一個Activity甚至達到了四五千行代碼,維護起來極為不便.原因也很明顯,就是Activity既參與api訪問和數(shù)據(jù)調(diào)用,又參與了界面的更新,職能劃分不明確,沒有完全實現(xiàn)解耦.我們的想法是,能不能讓Activity只做界面響應和更新,其他業(yè)務邏輯全部由另外一個單獨模塊來完成?于是MVP誕生了.
MVP模式將Controller改名為Presenter,同時改變了通信方向.
1.各部分之間的通信,都是雙向的.
2.View與Model不發(fā)生聯(lián)系,都通過Presenter傳遞.
3.View非常薄,不部署任何業(yè)務邏輯,稱為"被動視圖"(Passive View),即沒有任何主動性,而Presenter非常厚,所有邏輯都部署在那里.
當這樣調(diào)整了之后, Activity就純粹屬于View層了,所有業(yè)務邏輯全由Presenter來完成.當View界面被用戶操作時(比如按鈕點擊), View層就會調(diào)用Presenter完成相關業(yè)務邏輯,而Presenter完成了之后,就會將結(jié)果以回調(diào)的形式傳遞給View層,由View層完成界面刷新.具體代碼如何實現(xiàn)我就不多說了,因為我們今天的重點是MVVM
3. MVVM模式當我們采用MVP模式之后,發(fā)現(xiàn)Activity幾乎沒啥事可做了,我們的項目代碼層級也清晰了,也好維護了.但是MVP也有缺點,比如,為了實現(xiàn)MVP,我們需要額外增加好多接口和類,比如,一個Activity需要對應一個Presenter類和Presenter接口,同時為了方便Activity和Presenter進行通信,還得再定義一個回調(diào)接口IView,也就是說,每一個Activity都需要額外增加兩個接口和一個類,無疑提高了代碼量.而MVVM的誕生,就解決了這個問題!
MVVM模式將Presenter改名為ViewModel,基本上與MVP模式完全一致.
唯一的區(qū)別是,它采用雙向綁定(data-binding):View的變動,自動反映在ViewModel,反之亦然.
有沒有注意到, MVVM和MVP幾乎是一樣的,唯一的不同就在于View和ViewModel之間的那根線, MVP是兩根,表示View調(diào)用Presenter執(zhí)行邏輯,Presenter調(diào)用View來返回數(shù)據(jù),更新界面;MVVM中只有一根線兩個箭頭,代表的是View和ViewModel雙向綁定,自動同步數(shù)據(jù),無需手動調(diào)用相關方法進行通信,從而減少了代碼量.而這種雙向綁定的機制,都歸功于谷歌推出的DataBinding的新功能.下面我們來研究一下到底什么是DataBinding.
本文版權(quán)歸傳智播客Android培訓學院所有,歡迎轉(zhuǎn)載,轉(zhuǎn)載請注明作者出處。謝謝!
作者:傳智播客Android培訓學院
首發(fā):http://xamj520.com/Android