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.如何選取框架
一句話:沒有最好,結合項目本身哪個合適用哪個!
今天的分享結束了,再見~