Android 中MVC,MVP,MVVM三者框架對比介紹

1.什么是MVC應用框架

MVC全名是Model View Controller,是模型(model)-視圖(view)-控制器(controller)的縮寫,一種業(yè)務邏輯、數據、界面顯示分離的方法組織代碼,將業(yè)務邏輯聚集到一個部件里面,在改進和個性化定制界面及用戶交互的同時,不需要重新編寫業(yè)務邏輯。

1.1數據關系

(1) View 接受用戶交互請求

(2) View 將請求轉交給Controller

(3) Controller 操作Model進行數據更新

(4) 數據更新之后Model通知View更新數據變化

(5)View 更新變化數據

1.2方式:單向通信

1.3優(yōu)點

(1) 耦合性降低,MVC本質是分層耦合,減少代碼之間的相互影響。

(2) 可擴展性好,由于耦合性低,在增加需求時,改動小,bug出現的機率小。

(3) 有利于代碼的維護,MVC三層分工明確,模塊職能劃分明確。

1.4缺點

隨著項目的增大,Activity/Fragment的代碼會變得臃腫。

1.5適用場景

適合功能較少,業(yè)務邏輯簡單,界面不復雜的小型項目


2.什么是MVP應用框架

MVP的全稱為Model-View-Presenter,分別代表項目中3個不同的模塊

模型(Model):負責處理數據的加載或者存儲,比如從網絡或本地數據庫獲取數據等;

視圖(View):負責界面數據的展示,與用戶進行交互;

主持人(Presenter):相當于協(xié)調者,是模型與視圖之間的橋梁,將模型與視圖分離開來。

2.1數據關系

(1) View 接收用戶交互請求

(2) View 將請求轉交給 Presenter

(3) Presenter 操作Model進行數據更新

(4) Model 通知Presenter數據發(fā)生變化

(5) Presenter 更新View數據

2.2方式:雙向通信

當業(yè)務層處理完成后,需要在view層進行回調。有兩種方法:

?第一種:fragment、Activity中new出presenter時,一般通過presenter的構造方法把this傳進去,當業(yè)務層處理完成后就能調到Fragement或者Activity中的方法了。

第二種:通過接口回調的形式實現,fragment或者Activity實現某個View層接口,同樣需要在presenter的構造方法傳入this。在presenter調用該接口的方法

2.3優(yōu)點

(1) Model與View完全分離,修改互不影響

因為所有的邏輯交互都發(fā)生在一個地方Presenter內部,減少了Model與View層之間的耦合度。

(2) Model層可以封裝復用,可以極大的減少代碼量。

(3) 一個Preseter可用于多個View,而不需要改變Presenter的邏輯(因為View的變化總是比Model的變化頻繁)。

(4) 便于測試。把邏輯放在Presenter中,就可以脫離用戶接口來測試邏輯(單元測試)

2.4缺點

隨著業(yè)務邏輯的增加,一個頁面可能會非常復雜,UI 的改變是非常多,造成 View 的接口會很龐大,Presenter層的代碼也會越來越臃腫。

2.5適用場景

對于業(yè)務很復雜的大型APP來說,過多的Model ,View, Presenter,就會造成視覺疲勞,不利于維護和管理;對于業(yè)務很簡單的小型APP來說,只需要幾個類就可以解決的事情,使用MVP會多出一大堆接口,雖然代碼層次清晰了,但開發(fā)成本變高了。所以MVP適合不大也不小的項目。

3.什么是MVVM應用框架

MVVM 是 Model-View-ViewModel 的簡寫。它是 MVP的改進版,解決MVP的不足。MVVM 就是將其中的 View 的狀態(tài)和行為抽象化,讓我們將視圖 UI 和業(yè)務邏輯分開。

模型層 (Model):負責從各種數據源中獲取數據;

視圖層 (View):在 Android 中對應于 Activity 和 Fragment,用于展示給用戶和處理用戶交互,會驅動 ViewModel 從 Model 中獲取數據;

ViewModel 層:用于將 Model 和 View 進行關聯,我們可以在 View 中通過 ViewModel 從 Model 中獲取數據;當獲取到了數據之后,會通過自動綁定,將結果自動刷新到界面上。可以使用官方的架構組件 LiveData、DataBinding 去實現 MVVM架構。 例如DataBindin架構組件會把ViewModel綁定到 XML文件中,保證View中的數值來源都是來自ViewModel,降低布局和邏輯的耦合性。

3.1數據關系

(1) View 接收用戶交互請求

(2) View 將請求轉交給ViewModel

(3) ViewModel 操作Model數據更新

(4) Model 更新完數據,通知ViewModel數據發(fā)生變化

(5) ViewModel 更新View數據

3.2方式:雙向綁定。View/Model的變動,只要改其中一方,另一方都能夠及時更新到

3.3優(yōu)點

(1) 低耦合。View可以獨立于Model變化和修改,一個ViewModel可以綁定到不同的View上,當View變化的時候Model可以不變,當Model變化的時候View也可以不變。

(2) 可重用性。你可以把一些視圖邏輯放在一個ViewModel里面,讓很多view重用這段視圖邏輯。

(3) 獨立開發(fā)。開發(fā)人員可以專注于業(yè)務邏輯和數據的開發(fā)(ViewModel),設計人員可以專注于頁面設計,生成xml代碼。

(4) 可測試。界面向來是比較難測試的,而現在測試可以針對ViewModel來寫。

3.4缺點

bug不好找,比如界面異常,有可能是View出錯,也有可能是ViewModel的業(yè)務邏輯有問題,也有可能是Model的數據出錯。對于過大的項目,數據綁定會導致內存開銷大,而對于簡單的項目,使用MVVM有點大材小用。

3.5適用場景

雖然MVVM兼容當下使用的 MVC/MVP 框架。但是不適用于簡單的界面和太過復雜的界面。對于簡單界面而言,MVVM反而使邏輯復雜化了,對于復雜界面而言,相對應的ViewModel的構建和維護成本就會變的很高。



4.ViewModel生命周期


這張ViewModel生命周期圖是谷歌官方提供的,從這上面顯示Activity在橫豎屏旋轉重建時ViewModel也是一直存在內存中的。


5.MVC,MVP,MVVM三者演化



6.MVP和MVC的最大區(qū)別

在MVP中View并不直接使用Model,它們之間的通信是通過Presenter 來進行的,所有的交互都發(fā)生在Presenter內部,而在MVC中View直接從Model中讀取數據而不是通過 Controller。

7.如何選取框架

一句話:沒有最好,結合項目本身哪個合適用哪個!

今天的分享結束了,再見~

?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。
禁止轉載,如需轉載請通過簡信或評論聯系作者。

相關閱讀更多精彩內容

友情鏈接更多精彩內容