MVVM實踐

前言

在介紹MVVM框架以前,先給你們簡單介紹一下MVC、MVP框架(因爲本博文主要講解MVVM,因此MVC和MVP將簡化介紹,若是須要我將在之後的博文中補充進來)。html

架構:簡單的說架構就是一個藍圖,是一種設計方案,將客戶的不一樣需求抽象成爲抽象組件,而且可以描述這些抽象組件之間的通訊和調用。設計模式

框架:軟件框架是項目軟件開發過程當中提取特定領域軟件的共性部分造成的體系結構,不一樣領域的軟件項目有着不一樣的框架類型。框架不是現成可用的應用系統。而是一個半成品,提供了諸多服務,開發人員進行二次開發,實現具體功能的應用系統。瀏覽器

設計模式:是一套被反覆使用、多數人知曉的、通過分類編目的、代碼設計經驗的總結,它強調的是一個設計問題的解決方法。架構

MVC(model view controller)框架--模型視圖控制器 模型:

輸入圖片說明

  • M-Model : 業務邏輯和實體模型(biz/bean)
  • V-View : 佈局文件(XML)
  • C-Controller : 控制器(Activity)

相信你們都熟悉這個框架,這個也是初學者最經常使用的框架,該框架雖然也是把代碼邏輯和UI層分離,可是View層能作的事情仍是不多的,不少對於頁面的呈現仍是交由C實現,這樣會致使項目中C的代碼臃腫,若是項目小,代碼臃腫點仍是能接受的,可是隨着項目的不斷迭代,代碼量的增長,你就會沒辦法忍受該框架開發的項目,這時MVP框架就應運而生。框架

數據處理流程以下圖所示:佈局

輸入圖片說明

用戶操做瀏覽器,1.瀏覽器經過HTTP協議發出數據請求。2.控制器接收請求,經過路徑2委託給數據模型,模型經過與邏輯層和持久層的交互,把處理結果反饋給控制器,控制器根據視圖結果組裝視圖,並最終反饋給瀏覽器能夠接受的html數據。單元測試

MVP框架:

輸入圖片說明

  • M-Model : 業務邏輯和實體模型(biz/bean)
  • V-View : 佈局文件(XML)和Activity
  • P-Presenter : 完成View和Model的交互

MVP框架相對於MVC框架作了較大的改變,將Activity當作View使用,代替MVC框架中的C的是P,對比MVC和MVP的模型圖能夠發現變化最大的是View層和Model層不在直接通訊,全部交互的工做都交由Presenter層來解決。既然二者都經過Presenter來通訊,爲了複用和可拓展性,MVP框架基於接口設計的理念你們天然就能夠理解其用意。測試

但MVP框架也有不足之處:動畫

1.接口過多,必定程度影響了編碼效率。編碼

2.業務邏輯抽象到Presenter中,較爲複雜的界面Activity代碼量依然會不少。

3.致使Presenter的代碼量過大。

MVVM框架:

輸入圖片說明

  1. 可重用性。你能夠把一些視圖邏輯放在一個ViewModel裏面,讓不少View重用這段視圖邏輯。 在Android中,佈局裏能夠進行一個視圖邏輯,而且Model發生變化,View也隨着發生變化。

  2. 低耦合。之前Activity、Fragment中須要把數據填充到View,還要進行一些視圖邏輯。如今這些均可在佈局中完成(具體代碼請看後面) 甚至都不須要再Activity、Fragment去findViewById()。這時候Activity、Fragment只須要作好的邏輯處理就能夠了。

MVVM 在項目中的使用位置

輸入圖片說明

MVVM的Model、View、ViewModel分工

1. View

  • 負責界面和顯示,界面構成元素有window, controls, page, dataTemplete, custom controls….
  • 代碼一般有XAML和XAML.CS組成,但後臺代碼應該不多
  • 經過DataContext和ViewModel綁定
  • 不直接和Model交互!
  • 控件能夠和ViewModel的公共屬性綁定,update須要雙向綁定
  • 控件能夠觸發Behavior/Command調用ViewModel的方法,Command是View到ViewModel的- - 單向通信 (View中觸發事件,ViewModel中處理事件)

2. ViewModel

  • 主要包括界面邏輯和模型數據封裝,Behavior/Command事件響應,綁定的屬性定義等 ViewModel繼承Model類,或者是Model的繼承類
  • 是view和model的橋樑,是對Model的抽象,例如,model中數據格式是「年月日」,能夠在view- Model中轉換model中的數據爲「日月年」以供視圖(view)顯示。
  • 維護視圖狀態
  • 實現屬性或集合的change notification 輸入圖片說明

3. Model

  • 數據和業務邏輯
  • 客戶端領域模型
  • 由data entities, business objects, repositories and services構成
  • 能夠實現屬性或集合的change notification
  • 能夠實現validation 接口例如 IDataErrorInfo

View和ViewModel主要經過數據綁定和Command/Behavior進行交互,以下圖所示:

輸入圖片說明

有關Model(模型)和DTO的問題

輸入圖片說明

MVVM的實踐要點

  1. View分離要完全,不要有壞味道

視圖(view)部分,xaml.cs 應該只有不多的代碼或沒有代碼,若是你的xaml.cs包含大量的代碼,那麼極可能你MVVM用的不對頭,須要檢查其中代碼的壞味道。Xaml和xaml.cs 只能包含處理界面、視圖、顯示樣式、視圖元素之間的交互、視圖元素動畫,等等的內容。

  1. ViewModel要可測試輸入圖片說明

從重構的觀點看,若是你的代碼中ViewModel是可測試的,有詳細的單元測試Unit Test,你的代碼是OK的,不然須要檢查其中的壞味道。

輸入圖片說明

WPF實現MVVM的示例

示例項目源代碼下載:

http://files.cnblogs.com/hielvis/WpfMVVMSample.rar

相關文章
相關標籤/搜索