MVC、MVP和MVVM的區別

milk發表於2021-06-01

前言

在web1.0時代時,那個時候程式猿還沒有前後端之分,更程式設計師開發的時候,都是要前後端一起寫的,前後端的程式碼都是雜揉在一起,如圖下

這種開發模式的話,開發的時候因為不需要和其他人員溝通協作,前後端都是程式碼都是寫在一起,優缺點如下:

優點:簡單快捷

缺點:程式碼難以維護

 為了讓開發更佳便捷,程式碼更易於維護,前後端職責更加清晰。便衍生出MVC開發模式和框架,前端展示以模板的形式出現。我當時實習的時候,所在的公司開發模式就是使用這種開發模式,開發模式如圖:

使用這種分層架構,前後端職責清晰,程式碼也易於維護。但是這裡的MVC僅限於後端,前後端形成了一定的分離,前端只完成了後端開發中的view層

缺點:

1. 前端頁面開發效率不高

2. 前後端職責不夠清晰 

 

自從Gmail的出現,ajax技術開始風靡全球。有了ajax之後,前後端的職責就更加清晰了。因為前端可以通過ajax與後端進行資料互動,因此,整體的架構圖也就變化成了下面這幅圖。

通過ajax與後臺伺服器進行資料交換,前端開發人員,只需要開發頁面這部分內容,資料可由後臺進行提供。而且ajax可以是的頁面實現部分,減少了服務端負載和流量消耗,使用者體驗也更佳。這時,才開始有專職的前端工程師,同時前端的類庫也慢慢的開始發展,例如當時最著名的jquery。

缺點:缺乏可行的開發模式承載更復雜的業務需求,頁面內容都雜糅在一起,一旦應用規模增大,就會導致專案難以維護。因此,前端的MVC框架也就隨之而來了

前後端分離後的架構演變--MVC、MVP、MVVM

MVC

前端的MVC與後端類似,具備著view、controller和Model。

Model:負責儲存應用資料,與後端資料進行同步

Controller:負責業務邏輯,根據使用者行為對model資料進行修改

View:負責檢視展示,將model中的資料視覺化出來

三者形成了如圖所示的模型:

 

實際開發中,我們往往會看到另外一種模式:

這種模式在開發中更加的靈活,backbone.js就是這種模式

但是,這種靈活可能導致嚴重的問題:

資料流混亂。如下圖:

view比較龐大,而Controller比較單薄:由於很多的開發者都會在view中寫一些邏輯程式碼,逐漸的就導致view中的內容越來越龐大,而controller變得越來越單薄

既然有缺陷,就會有變革,前端的變化中,似乎跳過了MVP這種模式,是因為Angular早早的將MVVM框架帶入了前端。MVP模式雖然前端開發中並不常見,但是在安卓等原生開發中,開發中還是會考慮它

MVP

MVP和MVC很接近,P指的是Presenter,presenter可以理解為一箇中間人,它負責著View和Model之間的資料流動 ,防止View和model之間直接交流。我們可以看一下圖示

我們通過圖可以看到,presenter負責和Model進行雙向互動,這種互動方式,相對於MVC來說,少了一些靈活,View變成了被動檢視,並且本身變得很小,雖然它分了view和model,但是應用逐漸變大之後,導致presenter的體積增大,難以維護,要解決這個問題。或許可以從MVVM的思想中找到答案

MVVM

什麼是MVVM?MVVM可以分解為Model-View—ViewModel,ViewModel可以理解為在presenter基礎上的進階版本,如圖所示:

ViewModel通過實現一套資料響應式機制自動響應Model中資料變化;

同時ViewModel會實現一套更新策略自動將資料變化轉換為檢視更新

通過事件監聽響應View中互動修改Model中資料

這樣在ViewModel中就嫻熟了大量DOM操作程式碼

MVVM在保持VIEW和Model鬆耦合的同時,還減少了維護他們關係的程式碼,使使用者專注於業務邏輯,兼顧開發效率和可維護性

總結:

  • 這三者都是框架模式,他們設計的目標都是為了解決Model和View的耦合問題。

  • MVC模式出現較早,主要應用在後端,如Spring MVC、Asp.NET MVC等,在前端領域的早期也有應用,如Backbone.js。它的優點是分層清晰,缺點是資料流混亂,靈活性帶來的維護性問題

  • MVP模式是在MVC的進化形式,Presenter作為中間層負責MV通訊,解決了兩者耦合問題,但P層過於臃腫會導致維護問題

  • MVVM模式是目前前端的主流模式,在前端領域有著廣泛應用,它不僅解決MV耦合問題,還同時解決了維護兩者對映關係的大量繁雜程式碼和DOM操作程式碼,在提高開發效率、可讀性同時還保持了優越的效能表現

相關文章