
mvp 相對于mvc 主要是將m與v進(jìn)行拆分;
在mvc中 Activity 既要去處理 c 的工作,還得去更新v ;在mvp中 由p去控制,activity去做v處理顯示
在mvc中,mv的分層總給人傻傻分不清的感覺,而且布局xml的作用過于弱,Activity即要去做控制,也要去處理view的交互,過于耦合。
為了解決這個問題,便誕生了mvp的設(shè)計模式,主要目的就是將Activity這個既要做controler也要做view的交互的模塊進(jìn)行解耦,把控制層交給presenter去處理,而Activity只做view層的處理,model層還是做數(shù)據(jù)的交互,但是與view層毫無聯(lián)系,這便是mvp。
但是mvp有個缺點(diǎn)就是隨著業(yè)務(wù)的不斷擴(kuò)充,一個頁面可能非常復(fù)雜,UI的改變是非常多的,便會有非常多的case,這樣就會造成View的接口會非常的龐大;
為了解決這個問題,MVVM就出現(xiàn)在了歷史的舞臺上,通過雙向綁定的機(jī)制,實(shí)現(xiàn)數(shù)據(jù)和UI內(nèi)容,只要想改變其中的一方,另一方可以及時的更新的設(shè)計理念,這樣省去了在View層寫很多case的情況,只需要改變數(shù)據(jù)即可。
MVVM的缺點(diǎn):但是由于數(shù)據(jù)和視圖的雙向綁定,導(dǎo)致出現(xiàn)問題時不太好定位來源,有可能數(shù)據(jù)問題導(dǎo)致,也有可能業(yè)務(wù)邏輯中對視圖屬性的修改導(dǎo)致。如果項(xiàng)目中打算用MVVM的話可以考慮使用官方的架構(gòu)組件ViewModel、LiveData、DataBinding去實(shí)現(xiàn)MVVM
如何選擇?
1、如果項(xiàng)目簡單,沒什么復(fù)雜性,未來改動也不大的話,那就不要用設(shè)計模式或者架構(gòu)方法,只需要將每個模塊封裝好,方便調(diào)用即可,不要為了使用設(shè)計模式或架構(gòu)方法而使用。
2、對于偏向展示型的app,絕大多數(shù)業(yè)務(wù)邏輯都在后端,app主要功能就是展示數(shù)據(jù),交互等,建議使用mvvm。
3、對于工具類或者需要寫很多業(yè)務(wù)邏輯app,使用mvp或者mvvm都可。
4、如果想通過一個項(xiàng)目去學(xué)習(xí)架構(gòu)和設(shè)計模式,建議用MVC然后在此基礎(chǔ)上慢慢挖掘改進(jìn)。最后你可能發(fā)現(xiàn),改進(jìn)的最終結(jié)果可能就變成了mvp,mvvm。