在介紹MVVM框架以前,先給你們簡單介紹一下MVC、MVP框架(因爲本博文主要講解MVVM,因此MVC和MVP將簡化介紹,若是須要我將在之後的博文中補充進來)。html
架構:簡單的說架構就是一個藍圖,是一種設計方案,將客戶的不一樣需求抽象成爲抽象組件,而且可以描述這些抽象組件之間的通訊和調用。設計模式
框架:軟件框架是項目軟件開發過程當中提取特定領域軟件的共性部分造成的體系結構,不一樣領域的軟件項目有着不一樣的框架類型。框架不是現成可用的應用系統。而是一個半成品,提供了諸多服務,開發人員進行二次開發,實現具體功能的應用系統。瀏覽器
設計模式:是一套被反覆使用、多數人知曉的、通過分類編目的、代碼設計經驗的總結,它強調的是一個設計問題的解決方法。架構
相信你們都熟悉這個框架,這個也是初學者最經常使用的框架,該框架雖然也是把代碼邏輯和UI層分離,可是View層能作的事情仍是不多的,不少對於頁面的呈現仍是交由C實現,這樣會致使項目中C的代碼臃腫,若是項目小,代碼臃腫點仍是能接受的,可是隨着項目的不斷迭代,代碼量的增長,你就會沒辦法忍受該框架開發的項目,這時MVP框架就應運而生。框架
數據處理流程以下圖所示:佈局
用戶操做瀏覽器,1.瀏覽器經過HTTP協議發出數據請求。2.控制器接收請求,經過路徑2委託給數據模型,模型經過與邏輯層和持久層的交互,把處理結果反饋給控制器,控制器根據視圖結果組裝視圖,並最終反饋給瀏覽器能夠接受的html數據。單元測試
MVP框架相對於MVC框架作了較大的改變,將Activity當作View使用,代替MVC框架中的C的是P,對比MVC和MVP的模型圖能夠發現變化最大的是View層和Model層不在直接通訊,全部交互的工做都交由Presenter層來解決。既然二者都經過Presenter來通訊,爲了複用和可拓展性,MVP框架基於接口設計的理念你們天然就能夠理解其用意。測試
但MVP框架也有不足之處:動畫
1.接口過多,必定程度影響了編碼效率。編碼
2.業務邏輯抽象到Presenter中,較爲複雜的界面Activity代碼量依然會不少。
3.致使Presenter的代碼量過大。
可重用性。你能夠把一些視圖邏輯放在一個ViewModel裏面,讓不少View重用這段視圖邏輯。 在Android中,佈局裏能夠進行一個視圖邏輯,而且Model發生變化,View也隨着發生變化。
低耦合。之前Activity、Fragment中須要把數據填充到View,還要進行一些視圖邏輯。如今這些均可在佈局中完成(具體代碼請看後面) 甚至都不須要再Activity、Fragment去findViewById()。這時候Activity、Fragment只須要作好的邏輯處理就能夠了。
MVVM 在項目中的使用位置
View和ViewModel主要經過數據綁定和Command/Behavior進行交互,以下圖所示:
有關Model(模型)和DTO的問題
MVVM的實踐要點
視圖(view)部分,xaml.cs 應該只有不多的代碼或沒有代碼,若是你的xaml.cs包含大量的代碼,那麼極可能你MVVM用的不對頭,須要檢查其中代碼的壞味道。Xaml和xaml.cs 只能包含處理界面、視圖、顯示樣式、視圖元素之間的交互、視圖元素動畫,等等的內容。
從重構的觀點看,若是你的代碼中ViewModel是可測試的,有詳細的單元測試Unit Test,你的代碼是OK的,不然須要檢查其中的壞味道。
示例項目源代碼下載: