【有夢想的IT人】一篇文章告訴你MVC&MVP&MVVM

一個人善于使用模式瘤睹,相當(dāng)于把一些特定問題進行了抽象概括魔眨,大腦其實可以騰出更大的空間處理別的事情(具體的業(yè)務(wù)等)舌剂。所以裕便,這一兩年我也比較喜歡嘗試使用一些流行的模式或者開源框架到自己的項目中,最終不一定會投入使用,但嘗試的過程還是很有益處的递览。今天我們就把開發(fā)當(dāng)中常用的模式簡單介紹一下叼屠。來小可愛,上車吧绞铃!

Paste_Image.png

MVC

MVC全名是Model--View--Controller镜雨,是模型(model)-視圖(view)-控制器(controller)的縮寫,一種軟件設(shè)計典范儿捧,用一種業(yè)務(wù)邏輯、數(shù)據(jù)菲盾、界面顯示分離的方法組織代碼,在改進和個性化定制界面及用戶交互的同時诡挂,不需要重新編寫業(yè)務(wù)邏輯。其中Model層處理數(shù)據(jù)临谱,業(yè)務(wù)邏輯等璃俗;View層處理界面的顯示結(jié)果悉默;Controller層起到橋梁的作用,來控制View層和Model層通信以此來達到分離視圖顯示和業(yè)務(wù)邏輯層抄课。

Paste_Image.png

我們往往把Android中界面部分的實現(xiàn)也理解為采用了MVC框架唱星,常常把Activity理解為MVC模式中的Controller。
看似沒有什么特別的地方跟磨,但是由幾個需要特別關(guān)注的關(guān)鍵點:

1间聊、View是把控制權(quán)交移給Controller抵拘,自己不執(zhí)行業(yè)務(wù)邏輯。

2、Controller執(zhí)行業(yè)務(wù)邏輯并且操作Model偷遗,但不會直接操作View,可以說它是對View無知的喉酌。

3、View和Model的同步消息是通過觀察者模式進行泪电,而同步操作是由View自己請求Model的數(shù)據(jù)然后對視圖進行更新。

MVC的優(yōu)缺點
  • 優(yōu)點:
1碟渺、把業(yè)務(wù)邏輯全部分離到Controller中突诬,模塊化程度高。當(dāng)業(yè)務(wù)邏輯變更的時候旺隙,不需要變更View和Model,    只需要Controller  換成另外一個  
     Controller就行了(Swappable Controller)垄提。
2周拐、觀察者模式可以做到多視圖同時更新。
  • 缺點:
1速妖、Controller測試?yán)щy。因為視圖同步操作是由View自己執(zhí)行罕容,而View只能在有UI的環(huán)境下運行。在沒有UI環(huán)境下對Controller進行單元測試的時候锦秒,  
     Controller業(yè)務(wù)邏輯的正確性是無法驗證的:Controller更新Model的時候,無法對View的更新操作進行斷言惭笑。
2生真、View無法組件化。View是強依賴特定的Model的川蒙,如果需要把這個View抽出來作為一個另外一個應(yīng)用程序可復(fù)用的組件就困難了长已。
     因為不同程序的的Domain Model是不一樣的

MVP

MVP其實是MVC的一種演進版本昼牛,它更簡單康聂,將MVC中的Controller改為了Presenter,View通過接口與Presenter進行交互恬汁,降低耦合蕊连,方便進行單元測試。

View:負責(zé)繪制UI元素甘苍、與用戶進行交互(Activity、View看彼、Fragment都可以做為View層)囚聚;
Model:對數(shù)據(jù)的操作、對網(wǎng)絡(luò)等的操作顽铸,和業(yè)務(wù)相關(guān)的邏輯處理谓松;
Presenter:作為View與Model交互的中間紐帶,處理與用戶交互的邏輯鬼譬。可以把Presenter理解為一個中間層的角色竣贪,它接受Model層的數(shù)據(jù)巩螃,并且處理之后傳遞給View層,還需要處理View層的用戶交互等操作避乏。

Paste_Image.png
關(guān)鍵點:
1淑际、View不再負責(zé)同步的邏輯,而是由Presenter負責(zé)春缕。Presenter中既有業(yè)務(wù)邏輯也有同步邏輯锄贼。
2、View需要提供操作界面的接口給Presenter進行調(diào)用宅荤。(關(guān)鍵)

對比在MVC中,Controller是不能操作View的惹盼,View也沒有提供相應(yīng)的接口惫确;而在MVP當(dāng)中,Presenter可以操作View改化,View需要提供一組對界面操作的接口給Presenter進行調(diào)用陈肛;Model仍然通過事件廣播自己的變更,但由Presenter監(jiān)聽而不是View句旱。

MVP(Passive View)的優(yōu)缺點
  • 優(yōu)點:
1、便于測試稚配。Presenter對View是通過接口進行港华,在對Presenter進行不依賴UI環(huán)境的單元測試的時候∶疤眩可以通過Mock一個View對象橙数,這個對象只需要實現(xiàn)了View的接口即可。然后依賴注入到Presenter中灯帮,單元測試的時候就可以完整的測試Presenter業(yè)務(wù)邏輯的正確性逻住。
2瞎访、View可以進行組件化吁恍。在MVP當(dāng)中,View不依賴Model冀瓦。這樣就可以讓View從特定的業(yè)務(wù)場景中脫離出來,可以說View可以做到對業(yè)務(wù)邏輯完全無知拾徙。它只需要提供一系列接口提供給上層操作肄程。這樣就可以做高度可復(fù)用的View組件。
  • 缺點:
1玄叠、Presenter中除了業(yè)務(wù)邏輯以外拓提,還有大量的View->Model,Model->View的手動同步邏輯代态,造成Presenter比較笨重蹦疑,維護起來會比較困難。

MVVM

MVVM模式(Model--View--ViewModel模式)歉摧,和MVP模式相比,MVVM 模式用ViewModel替換了Presenter 再悼,其他層基本上與 MVP 模式一致膝但,ViewModel可以理解成是View的數(shù)據(jù)模型和Presenter的合體。

MVVM采用雙向綁定(data-binding):View的變動莺奸,自動反映在ViewModel,反之亦然灭贷,這種模式實際上是框架替應(yīng)用開發(fā)者做了一些工作(相當(dāng)于ViewModel類是由庫幫我們生成的),開發(fā)者只需要較少的代碼就能實現(xiàn)比較復(fù)雜的交互。

Paste_Image.png

MVVM的調(diào)用關(guān)系

MVVM的調(diào)用關(guān)系和MVP一樣古拴。但是真友,在ViewModel當(dāng)中會有一個叫Binder,或者是Data-binding engine的東西桅打。以前全部由Presenter負責(zé)的View和Model之間數(shù)據(jù)同步操作交由給Binder處理愈案。你只需要在View的模版語法當(dāng)中,指令式地聲明View上的顯示的內(nèi)容是和Model的哪一塊數(shù)據(jù)綁定的站绪。當(dāng)ViewModel對進行Model更新的時候恢准,Binder會自動把數(shù)據(jù)更新到View上去,當(dāng)用戶對View進行操作(例如表單輸入)馁筐,Binder也會自動把數(shù)據(jù)更新到Model上去。這種方式稱為:Two-way data-binding果正,雙向數(shù)據(jù)綁定赦抖。可以簡單而不恰當(dāng)?shù)乩斫鉃橐粋€模版引擎轮锥,但是會根據(jù)數(shù)據(jù)變更實時渲染要尔。

關(guān)鍵點:
MVVM把View和Model的同步邏輯自動化了新娜。以前Presenter負責(zé)的View和Model同步不再手動地進行操作既绩,而是交由框架所提供的Binder進行負責(zé)。
只需要告訴Binder私杜,View顯示的數(shù)據(jù)對應(yīng)的是Model哪一部分即可救欧。
MVVM的優(yōu)缺點
  • 優(yōu)點:
1、提高可維護性笆怠。解決了MVP大量的手動View和Model同步的問題蹬刷,提供雙向綁定機制。提高了代碼的可維護性办成。
2、簡化測試兽赁。因為同步邏輯是交由Binder做的冷守,View跟著Model同時變更,所以只需要保證Model的正確性亮钦,View就正確充活。大大減少了對View同步更新的測試。
  • 缺點:
1映穗、過于簡單的圖形界面不適用幕随,或說牛刀殺雞。
2、對于大型的圖形應(yīng)用程序睦霎,視圖狀態(tài)較多走诞,ViewModel的構(gòu)建和維護的成本都會比較高。
3碑幅、數(shù)據(jù)綁定的聲明是指令式地寫在View的模版當(dāng)中的塞绿,這些內(nèi)容是沒辦法去打斷點debug的。

結(jié)語

可以看到,從MVC->MVP->MVVM开皿,就像一個打怪升級的過程赋荆。后者解決了前者遺留的問題,把前者的缺點優(yōu)化成了優(yōu)點窄潭。同樣的Demo功能,代碼從最開始的一堆文件月帝,優(yōu)化成了最后只需要20幾行代碼就完成幽污。MV*模式之間的區(qū)分還是蠻清晰的,希望可以給對這些模式理解比較模糊的同學(xué)帶來一些參考和思路簸搞。

參考:http://www.reibang.com/p/6a86f7fdc0cb

嗨~我是夏尼采准潭,一個有夢想的IT男
每周輸出1篇有用的文章。
如果文章對您有幫助寺擂,希望能點個贊或者關(guān)注我。
您的關(guān)注和點贊是對我最大的鼓勵沽讹,感謝您的閱讀

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末爽雄,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子叹谁,更是在濱河造成了極大的恐慌乘盖,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,639評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件析苫,死亡現(xiàn)場離奇詭異穿扳,居然都是意外死亡,警方通過查閱死者的電腦和手機茫死,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,277評論 3 385
  • 文/潘曉璐 我一進店門峦萎,熙熙樓的掌柜王于貴愁眉苦臉地迎上來忆首,“玉大人,你說我怎么就攤上這事糙及。” “怎么了妒潭?”我有些...
    開封第一講書人閱讀 157,221評論 0 348
  • 文/不壞的土叔 我叫張陵雳灾,是天一觀的道長冯凹。 經(jīng)常有香客問我炒嘲,道長匈庭,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,474評論 1 283
  • 正文 為了忘掉前任夭拌,我火速辦了婚禮衷咽,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘桶现。我一直安慰自己鼎姊,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,570評論 6 386
  • 文/花漫 我一把揭開白布慰于。 她就那樣靜靜地躺著裆赵,像睡著了一般跺嗽。 火紅的嫁衣襯著肌膚如雪桨嫁。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,816評論 1 290
  • 那天楣导,我揣著相機與錄音畜挨,去河邊找鬼。 笑死毡咏,一個胖子當(dāng)著我的面吹牛逮刨,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 38,957評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼迎罗,長吁一口氣:“原來是場噩夢啊……” “哼片仿!你這毒婦竟也來了滋戳?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,718評論 0 266
  • 序言:老撾萬榮一對情侶失蹤咪笑,失蹤者是張志新(化名)和其女友劉穎娄涩,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體扬虚,經(jīng)...
    沈念sama閱讀 44,176評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡球恤,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,511評論 2 327
  • 正文 我和宋清朗相戀三年咽斧,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片张惹。...
    茶點故事閱讀 38,646評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡宛逗,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出替蔬,到底是詐尸還是另有隱情屎暇,我是刑警寧澤,帶...
    沈念sama閱讀 34,322評論 4 330
  • 正文 年R本政府宣布快毛,位于F島的核電站,受9級特大地震影響唠帝,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜襟衰,卻給世界環(huán)境...
    茶點故事閱讀 39,934評論 3 313
  • 文/蒙蒙 一瀑晒、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧苔悦,春花似錦、人聲如沸把介。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,755評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽向臀。三九已至,卻和暖如春君纫,著一層夾襖步出監(jiān)牢的瞬間三娩,已是汗流浹背妹懒。 一陣腳步聲響...
    開封第一講書人閱讀 31,987評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留会前,地道東北人匾竿。 一個月前我還...
    沈念sama閱讀 46,358評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像临庇,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子淮蜈,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,514評論 2 348

推薦閱讀更多精彩內(nèi)容