MVC,MVP和MVVM之間的區別

banq發表於2018-11-21

後端已經進入了後REST時代,RESTful將MVC和MVP和MVVM從後端伺服器端壓縮到了前端,從而實現了前後端分離,前端目前以React.js Vue.js為主,ReactJS是透過事件源這種函式式實現模型和檢視的繫結更新(ReduxFlux介紹),因此可以說,MVC, MVP和MVVM實則是過去落後的技術名詞。但是初學者可能需要了解這些之間區別,特別找到一篇文章翻譯如下:

MVC,MVP和MVVM是指導程式設計師建立解耦解決方案的一些常見模式。MVC,MVP和MVVM共有的軟體行為是:
  • 資料層/業務邏輯(模型):這是將業務邏輯應用於應用程式資料的行為。域模型通常表示模型,其中物件用於模擬現實世界實體。
  • 表示層/ UI(檢視):View負責應用程式的視覺化表示。此行為向使用者顯示模型資訊。
  • 應用程式邏輯(控制器,表示或檢視模型):此行為包含實現模型和檢視之間互動的邏輯。


MVC模式

  • MVC由三層Model,View和Controller組成。
  • MVC是一種複合模式
  • 它使用前端控制器模式,透過單個控制器處理Web應用程式請求。因此控制器是MVC中動作入口點。
  • 它不使用檢視狀態或基於伺服器的表單。這使得MVC框架非常適合希望完全控制應用程式行為的開發人員。
  • 它為測試驅動開發(TDD)提供了更好的支援。
  • 它適用於大型開發人員團隊支援的Web應用程式以及需要對應用程式行為進行高度控制的Web設計人員
  • 客戶端庫:Backbone.js,knockback.js,Spine.js,angular.js。
  • 伺服器端庫:ASP。NET MVC, Spring MVC, Ruby-on-Rails


(banq注:MVC模式中控制器是整個流程核心,使用者看到的檢視,但是想看到哪個檢視,需要透過控制器選擇,哪個檢視對應哪個模型也是在控制器內部完成。)

MVP模式

  • MVP由三層Model,View和Presenter組成。
  • 在MVP中,檢視和模型更鬆散地耦合,提供更清晰的關注點分離。
  • MVP,View負責將使用者輸入委派給Presenter。
  • MVP,Presenter和View應該具有1-1關係,每個View都透過介面引用其Presenter。
  • MVP,view直接透過資料繫結繫結到Model。
  • 在MVP中,單元測試更容易,因為View透過易於模擬的介面瞭解Presenter。
  • 客戶端庫:Riot.js,GWT
  • 伺服器端庫:經典ASP. NET,JSP Servlets。

(banq注:MVP與MVC的區別是用Presenter替代了控制器Controller,這個模式在.NET中比較普及,JSP Servlet其實是用於MVC實現,Struts等背後都是基於JSP/Servlet的MVC框架,MVP中檢視能動性更強些,不像MVC中M和V都是被動的,靠控制器推動。)

MVVM​​​​​​​

  • MVVM模式是處理WPF和Silverlight應用程式此類問題的最佳解決方案之一。
  • 當您為WPF使用MVVM模式時,Silverlight檢視將不具有在UI程式碼中如此常見的典型事件處理程式。
  • MVVM在UI和應用程式邏輯之間提供了清晰的分離。
  • 客戶端庫:Knockout.js,Kendo(MVVM)
  • 伺服器端庫:WPF(桌面)或Silverlight,Windows Phone應用程式(XAML),Adobe Flex
  • MVVM模式包括三個關鍵部分:

  1.  模型(業務規則,資料訪問,模型類)
  2. 檢視(使用者介面(XAML))
  3. ViewModel(檢視和模型之間的代理或中間人)

(banq注:MVVM使用ViewModel檢視模型替代控制器和Presenter,ViewModel簡稱VM,別以為又多了一個元件,還是三個元件,主要是.NET中用得比較多,這種模式類似前端雙向或單向繫結,如果說,MVP中Presenter還要兼顧檢視和模型,那麼在MVVM中ViewModel直接和Model對應繫結;MVC和MVP中動作和資料都是分離的,資料在檢視和模型中,控制器或Presenter透過動作呼叫將兩者對應混合起來;但是在MVVM中,動作透過繫結融合了資料之中,透過事件或觀察者模式實現呼叫了。ReatJS等前端框架在這個基礎上發展其Flux等Reactive響應式框架。)

對該模式的批評來自MVVM建立者John Gossman本人,他指出實現MVVM的開銷對於簡單的UI操作來說是“過度殺傷”;對於更大的應用程式,概括提煉一個ViewModel變得很困難。此外,他說明在非常大的應用程式中的資料繫結可能導致相當大的記憶體消耗。



 

相關文章