淺談Android MVC、MVP和MVVM
模式的理解:軟件設(shè)計思路
一利花、MVC(Model科侈,View,Controller)
MVC模式是最經(jīng)典開發(fā)模式之一晋被,MVC將業(yè)務(wù)邏輯兑徘、數(shù)據(jù)控制與界面顯示分離,真正實現(xiàn)了代碼的低耦合羡洛,它分為三個部分Model挂脑,View,Controller
模型層(Model):數(shù)據(jù)模型欲侮,是對客觀事物的抽象崭闲。
視圖層(View):用戶界面,是model的具體表現(xiàn)形式威蕉。
控制器層(Controller):業(yè)務(wù)邏輯刁俭,主要負責與model和view打交道。
適用場景:適用于較小韧涨,功能較少牍戚,業(yè)務(wù)邏輯較少的項目侮繁。
MVC的優(yōu)缺點
優(yōu)點:
1、業(yè)務(wù)邏輯全部分離到Controller中如孝,模塊化程度高宪哩。
2、觀察者模式可以做到多視圖同時更新第晰。
缺點:
1锁孟、Model和View之間是直接進行交互,就必然會導致Model和View之間的耦合茁瘦。
2品抽、所有邏輯都寫在Controller層,導致Controller層特別臃腫甜熔。
二圆恤、MVP(Model,View腔稀,Presenter)
MVC架構(gòu)方式的變種哑了,使用Presenter來代替Controller,而且改變了數(shù)據(jù)的流向烧颖,View和Model之間不再直接進行交互,而是全部通過Presenter來進行窄陡。MVP模式就是把MVC模式中的Controller換成了Presenter炕淮。
在MVP當中,Presenter可以同時操作View和Model跳夭,View需要提供一組對界面操作的接口給Presenter進行調(diào)用涂圆;Model仍然通過事件廣播自己的變更,但由Presenter監(jiān)聽而不是View币叹。View 與 Model 不發(fā)生聯(lián)系润歉,都通過 Presenter 傳遞。
適用場景:視圖界面不是很多的項目中颈抚。
MVP的優(yōu)缺點
優(yōu)點:
1踩衩、模型與視圖完全分離,我們可以修改視圖而不影響模型贩汉。
2驱富、可以更高效地使用模型,因為所有的交互都發(fā)生在一個地方——Presenter內(nèi)部匹舞。
3褐鸥、我們可以將一個Presenter用于多個視圖,而不需要改變Presenter的邏輯赐稽。這個特性非常的有用叫榕,因為視圖的變化總是比模型的變化頻繁浑侥。
4、如果我們把邏輯放在Presenter中晰绎,那么我們就可以脫離用戶接口來測試這些邏輯(單元測試)寓落。
缺點:Presenter作為橋梁協(xié)調(diào)View和Model,就會導致Presenter變得很臃腫寒匙,維護比較困難零如。
三、MVVM(Model锄弱,View考蕾,ViewModel)
MVVM其實是對MVP的一種改良,他將Presenter替換成了ViewModel会宪,并通過雙向的數(shù)據(jù)綁定來實現(xiàn)視圖和數(shù)據(jù)的交互肖卧。
適用場景:適用于界面展示的數(shù)據(jù)較多的項目。
MVVM的優(yōu)缺點
優(yōu)點:
1掸鹅、低耦合塞帐。視圖(View)可以獨立于Model變化和修改,一個ViewModel可以綁定到不同的"View"上巍沙,當View變化的時候Model可以不變葵姥,當Model變化的時候View也可以不變。
2句携、可重用性榔幸。你可以把一些視圖邏輯放在一個ViewModel里面,讓很多view重用這段視圖邏輯矮嫉。
3削咆、獨立開發(fā)。開發(fā)人員可以專注于業(yè)務(wù)邏輯和數(shù)據(jù)的開發(fā)(ViewModel)蠢笋,設(shè)計人員可以專注于頁面設(shè)計拨齐,使用Expression Blend可以很容易設(shè)計界面并生成xml代碼。
4昨寞、可測試瞻惋。界面素來是比較難于測試的,而現(xiàn)在測試可以針對ViewModel來寫编矾。
5熟史、提高可維護性。解決了MVP大量的手動View和Model同步的問題窄俏,提供雙向綁定機制蹂匹。提高了代碼的可維護性。
缺點:
1凹蜈、過于簡單的圖形界面不適用限寞。
2忍啸、對于大型的圖形應(yīng)用程序,視圖狀態(tài)較多履植,ViewModel的構(gòu)建和維護的成本都會比較高计雌。
3、數(shù)據(jù)綁定的聲明是指令式地寫在View的模版當中的玫霎,這些內(nèi)容是沒辦法去打斷點debug的凿滤。
4、目前這種架構(gòu)方式的實現(xiàn)方式比較不完善規(guī)范庶近,常見的就是DataBinding框架