MVC vs. MVP vs. MVVM

Virus-BeautyCode發表於2014-04-25

 1 簡介

  三者的目的都是分離關注,使得UI更容易變換(從Winform變為Webform),使得UI更容易進行單元測試。

 2 MVC MVP

  2.1 MVC

  1、View接受使用者的互動請求,

  2、View將請求轉交給Controller,

  3、Controller操作Model進行資料更新

  4、資料更新之後,Model通知View資料變化

  5、View顯示更新之後的資料

  View和Controller使用Strategy模式實現,View使用Composite模式,View和Model通過Observer模式同步資訊。Controller不知道任何View的細節,一個Controller能被多個View使用。MVC的一個缺點是很難對controller進行單元測試,Controller運算元據,但是如何從View上斷言這些資料的變化呢?例如,點選一個View的按鈕,提交一個事件給Controller,Controller修改Model的值。這個值反映到View上是字型和顏色的變化。測試這個Case還是有點困難的。

  2.2 MVP

  1、  View接受使用者的互動請求

  2、  View將請求轉交給Presenter

  3、  Presenter操作Model進行資料庫更新

  4、  資料更新之後,Model通知Presenter資料發生變化

  5、  Presenter更新View的資料

  Presenter將Model的變化返回給View。和MVC不同的是,presenter會反作用於view,不像controller只會被動的接受view的指揮。正常情況下,發現可以抽象view,暴漏屬性和事件,然後presenter引用view的抽象。這樣可以很容易的構造view的mock物件,提高可單元測試性。在這裡,presenter的責任變大了,不僅要運算元據,而且要更新view。

  在現實中mvp的實現會根據view的充、貧血而有一些不同,一部分傾向於在view中放置簡單的邏輯,在presenter放置複雜的邏輯,另一部分傾向於在presenter中放置全部的邏輯。這兩種分別被稱為:Passive View和Superivising Controller。

  在Passive View中,為了減少UI元件的行為,使用controller不僅控制使用者事件的響應,而且將結果更新到view上。可以集中測試controller,減小view出問題的風險。

  在Superivising Controller中的controller既處理使用者輸入的響應,又操作view處理view的複雜邏輯。

 3 M-V-VM

  MVVM是在原有領域Model的基礎上新增一個ViewModel,這個ViewModel除了正常的屬性意外,還包括一些供View顯示用的屬性。例如在經典的MVP中,view有一個屬性ischeck,需要在presenter中設定view的ischeck值。但是在MVVM中的presenter也會有一個ischeck屬性來同步view的ischeck屬性,可能會用到observer模式同步ischeck的值。在MVVM中,presenter被改名為ViewModel,就演變成了你看到的MVVM。在支援雙向繫結的平臺,MVVM更受歡迎。例如:微軟的WPF和Silverlight。

  英文原文:MVC vs. MVP vs. MVVM 

相關文章