MVP, MVC, MVVM, 傻傻分不清楚~


最近MVC (Model-View-Controller) 和MVVM (Model-View-ViewModel) 在微軟圈成為顯學,ASP.NET MVC 和WPF 的Prism (MVVM Framework) 功不可沒,MVC 和MVVM 在概念上都是基於分層的,將呈現(presentation) 與資料(data) 分開的設計架構,M 和V 基本上不是問題,但將這兩個整合的中間這層可就有很多的學問,另外,除了MVC 和MVVM 外,還有一個叫做MVP (Model-View-Presenter) 的架構,這三個的設計概念非常類似,很容易會讓人傻傻分不清楚...

我們先來看各個架構的設計原則好了。

首先是MVC,顧名思義,MVC是將Model, View和Controller分離,讓彼此的職責(responsibility)能夠明確的分開,這樣不論是改M, V還是C,都可以確保另外兩層可不用做任何修改,同時這樣的分層也可以加強程式的可測試性(testability),View和Model基本上是相關的,但它們並不會有直接的相依關系,而是由Controller去決定Model產生的資料,然后丟給View去做呈現,也就是說,Controller是Model和View之間的協調者(coordinator),View和Model不能直接溝通,以確保責任的分離。而Controller可以只是一個系結Model和View的小類別,也可以是大到包含Workflow, Enterprise Services或是做為外部系統的Proxy Services等的邏輯系統,MVC各元件是可以分離的組件,也可以是分離的系統(當然要設計一些機制在相互溝通)。

(source: Wikipedia - http://en.wikipedia.org/wiki/Model-view-controller )

 

再來是MVVM,MVVM的架構一樣是M, V分離,但中間是以VM (ViewModel)來串接,這個ViewModel比較像是View的一個代理程式,它負責直接對Model做溝通,而View可以透過一些機制(ex: Events, Two-way Databindings, ...)來和ViewModel溝通以取得資料或將資料拋給Model做存取等工作,ViewModel也可以作為和外部系統的代理程式,例如Web Service或是REST Service或是Enterprise Services等等,不過它和MVC不同的地方,就是ViewModel和View的黏合度比較高,因為View必須要透過ViewModel才可以取得Model,而ViewModel又必須要處理來自View的通知訊息,所以雖然職責一樣分明,但是卻不像MVC那樣可以擴展到整個系統元件都能用。如果MVVM要和MVP比較的話,MVVM會比MVP更靈活一點。

Source: http://csharperimage.jeremylikness.com/2010/04/model-view-viewmodel-mvvm-explained.html

 

接着是MVP,MVP一樣也是職責分明,且Model與View分離的架構,但是這個P (Presenter)和ViewModel就很類似,不過就如同Presenter (主持人)這個字所代表的意義,所有主控View呈現的工作,都是由Presenter來做,而View本身只是Presenter所要使用的舞台而已,所以View原則上會相依於Presenter,但是為了要做到關注點分離(SoC原則),所以在View和Presenter間都會加入一個介面(ex: IView),然后以IoC的方式將View注射到Presenter中,而Presenter就使用介面所定義的方法去操控,而View就透過介面所定義的方法去呈現介面即可。但也因為受限於介面,所以Presenter只能依介面定義的動作去回應與處理,而不能再做更多的延伸功能,除非更改View的介面。

image

Source: http://blog.vuscode.com/malovicn/archive/2007/12/18/model-view-presenter-mvp-vs-model-view-controller-mvc.aspx

 

由上面各個架構的討論,我們可以得到以下的結果:

  1. MVC 架構適合於大型系統,它可以分層且可以在實體層面切割為不同的機器或服務,只要彼此間具有適當的通訊協定即可。
  2. MVVM 架構適合像XAML 這種與程式碼無關(code ignorance) 的使用者介面設計,只要View 中下特定的指令與ViewModel 串接,就可以享有ViewModel 溝通的功能,而ViewModel 只需做一些特別的介面實作,即可平順的和View 溝通。
  3. MVP 架構適合集中由程式碼決定View 動作的應用程式,而View 只需要實作特定的介面即可,不需要太復雜的工作,但Presenter 則可能會受限於View 介面的動作,而無法做更進一步對View 的控制。

 

最后我想提的是,MVC的包容度比MVVM和MVP要來的高,在MVC的V層,可以再進一步的包含MVVM或MVP的實作,而C層也可以使用MVP (V是輸出的資料)來進一步切割資料的流動與輸出,M層則可以類似MVVM的架構,當V (元件)有資料的異動時,VM即可自動偵測到並更新Model (資料庫)。當然,要用什么樣的架構去設計,端看當時的系統環境與需求來決定,而不是只想着要用同一種架構去做所有的系統。

 

Reference:

http://en.wikipedia.org/wiki/Model-view-presenter http://en.wikipedia.org/wiki/Model-view-controller http://en.wikipedia.org/wiki/Model_View_ViewModel http:/ /csharperimage.jeremylikness.com/2010/04/model-view-viewmodel-mvvm-explained.html http://blog.vuscode.com/malovicn/archive/2007/12/18/model-view-presenter-mvp- vs-model-view-controller-mvc.aspx http://msdn.microsoft.com/en-us/magazine/cc188690.aspx

 

轉自:http://www.dotblogs.com.tw/regionbbs/archive/2011/09/29/compare.to.mvp.mvc.mvvm.aspx


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM