引言
Android框架的發(fā)展的過程就是一個不斷化繁為簡的過程,大家都在研究如何正確方便高效的規(guī)范代碼。當(dāng)然這條路也永遠(yuǎn)不會停止,就像新的芽兒,隨著時間的流逝,每天都在長出新的枝葉,每天都在成長。對于技術(shù),每次新框架的提出都在剔除舊框架的詬病和痛點,演變成更方便,更高效,更簡潔的新框架,然后新的框架在具體使用中又會帶來新的詬病和痛點,反反復(fù)復(fù),無窮盡也......從開始使用MVC到使用MVP,從MVP到MVVM,每次框架的提出都有讓我們眼前一亮的東西,但具體使用中確還是存在很多的痛點,似乎一直存在一種反作用力來阻止我這樣做。但又能怎樣?新的芽兒注定會長成參天大樹,技術(shù)終究只會進(jìn)步。
咳咳,上面的雞湯你們喝起來可能無味,但對于自己經(jīng)歷了這么多框架的迭代后,結(jié)合自己親身的體會,那味道絕對濃厚。廢話不再多說,開啟今天的精彩內(nèi)容。
概述
MVC
MVC這里就不多說了,大家都熟悉的不能再熟悉了,比較古老的框架了,相信大家也都使用過;
MVC具體使用
Model:數(shù)據(jù)模型,JavaBean
View:layout布局文件
Control:Activity,處理數(shù)據(jù)請求,業(yè)務(wù)邏輯
MVC的詬病
view和control耦合嚴(yán)重,activity中存在大量的邏輯代碼,activity既是view,又是control,結(jié)構(gòu)不清晰,activity中內(nèi)容太多
MVP
MVP是在MVC的基礎(chǔ)上把Control獨立出來的模型,簡化Control的內(nèi)容,這里presenter充當(dāng)中間代理的角色,view和model不直接交互,而是通過presenter
MVP的具體使用
Model:實體模型,javabean
View:Activity和layout
Presenter:View和Model通過presenter交互
MVP的詬病
粒度很難把握,使用過MVP的都知道,MVP模型需要定義比較多的接口,view需要定義接口,presenter需要定義接口,以前我們使用一個activty能解決的問題,現(xiàn)在要將一個activity分解成一個View,一個Preseter,一個Model,每個模塊都需要使用接口來實現(xiàn)解耦,這樣就會導(dǎo)致有時候一個activity中涉及的業(yè)務(wù)比較多,按每個業(yè)務(wù)點搭建MVP模型的話,會導(dǎo)致原來一個activity類能搞定的,現(xiàn)在需要擴(kuò)展成多個接口,多個類才能實現(xiàn);粒度大的話,可能結(jié)構(gòu)不清晰;粒度小的話,代碼量又會比較大;
MVP是以UI和事件為驅(qū)動的模型,數(shù)據(jù)的獲取是被動的根據(jù)UI變動的,我們更希望是數(shù)據(jù)變化去更新UI,而不是反過來;
Presenter和View耦合度比較高;
Presenter類在業(yè)務(wù)比較復(fù)雜情況下,代碼量比較大;
MVVM
MVVM是在MVP的基礎(chǔ)上,根據(jù)谷歌提出的DateBinding方案重新設(shè)計的一個靈活高效的框架,MVVM使用ViewModel一層代替原來的Presenter層;
MVVM的使用
Model:數(shù)據(jù)模型,javaBean
View:Activty和layout
ViewModel:View和Model業(yè)務(wù)邏輯交互
MVVM的優(yōu)點
數(shù)據(jù)驅(qū)動
在MVVM中,數(shù)據(jù)的變化可以自動更新view,不需要獲取view的引用;
耦合較低
MVP模式中View和Presenter是強(qiáng)耦合的,Presenter需要拿到View的引用,這樣當(dāng)View變動時,Presenter也需要變化,耦合度太高;現(xiàn)在MVVM中,ViewModel只負(fù)責(zé)數(shù)據(jù)和業(yè)務(wù),View的變化,ViewModel不需要關(guān)系,數(shù)據(jù)變化,View自動更新,耦合度比較低;
View更新
MVVM模型中不用考慮是否在主線程中更新UI,DateBinding會負(fù)責(zé)在主線程中更新UI的,我們不用擔(dān)心線程的問題,簡單的不止一點點;
可重復(fù)利用
一個ViewModel就是一個數(shù)據(jù)源,可以將一個ViewModel綁定到不同的View中,就可以達(dá)到更新view目的
MVVM的詬病
MVVM由于是基于google的DataBinding框架的,而DataBinding支持的綁定view還比較少,因此在使用的過程中可能會遇到某些view無法使用dateBinding的情況,這點也是我之前沒有使用MVVM的原因
既然存在上面的問題,國內(nèi)外的大牛已經(jīng)幫我們封裝好了一套使用dateBinding的view庫,為避免重復(fù)造輪子,我們可以將它引入到我們的項目中直接使用,目前我知道的已經(jīng)支持常用所有view;
總結(jié)
經(jīng)過上面對不同框架的對比,相信大家都有一個基本的了解,有人會問這么多框架,我們使用那個比較好呢?
個人覺得,技術(shù)是在不斷進(jìn)步,舊的框架最終都會被新的框架所代替,我覺得MVVM的提出解決了我們使用其他框架的很多痛點,我覺得使用MVVM會更好點。
MVVM如何使用
篇幅原因,下一篇文章將為大家詳細(xì)介紹如何使用MVVM框架,敬請期待;