MVC和MVVM都是前端開發中常用的設計模式,都是為了解決前端開發中的復雜性而設計的,而MVVM模式則是一種基于
MVC模式的新模式。
MVC(Model-View-Controller)的三個核心部分:模型、視圖、控制器相較于MVVM(Model-View-ViewModel)的三個核心部分:模型、視圖、視圖模型的區別主要在于控制器和視圖模型的區別,模型、視圖幾乎無差別。
在MVC模式中,視圖與模型是通過控制器進行交互的,而在MVVM模式中,視圖與視圖模型之間是通過雙向數據綁定進行交互的。拿flutter舉個例子,MVC中View需要知道如何通過Controller來更新Model,并且必須手動調用setState()來刷新界面,MVVM通過數據綁定機制(如Provider),ViewModel的變化會自動反映到View上,減少了View對其他組件的直接依賴,實現了更加松散的耦合。
流程對比
MVC的流程
用戶交互:用戶與View進行交互(如點擊按鈕)。
調用Controller:View接收到用戶的輸入后,會直接調用相應的Controller方法。
處理邏輯:Controller接收請求后,可能會操作Model(如更新數據),然后決定需要顯示的數據。
更新View:Controller可能通過返回值或直接調用View的方法通知View更新自身顯示的內容。在某些實現中,View可能需要主動查詢Model或Controller獲取最新的數據狀態。
手動刷新UI:為了使UI反映出這些變化,通常需要在View中調用
setState()
(在Flutter中)或其他類似的方法來觸發視圖重繪。MVVM的流程
- 用戶交互:用戶與View交互(如點擊按鈕)。
- 調用ViewModel方法:用戶操作導致View調用ViewModel中的方法(例如,增加計數器的值)。
- 處理邏輯并通知:ViewModel執行業務邏輯,并在數據發生變化時調用notifyListeners()(或類似的機制)。這一步驟不需要直接與View交互,它只是簡單地通知其狀態發生了變化。
- 自動更新View:由于使用了數據綁定,當ViewModel的狀態改變時,所有監聽該狀態的View都會自動更新,無需額外的手動干預。這意味著一旦ViewModel中的數據發生變化,界面就會自動反映這些變化,而不需要顯式地調用setState()。
盡管兩者都需要實例化Controller或ViewModel,但它們在流程和交互方式上有著本質的區別:
- MVC更側重于通過控制器作為中介來協調模型和視圖之間的交互,要求視圖主動查詢或等待控制器的通知來進行更新。
- MVVM利用數據綁定機制,使得視圖能夠自動響應ViewModel的變化,降低了視圖與邏輯層之間的耦合度,簡化了狀態管理,提高了代碼的可維護性和測試性。
總結:個人覺得就是數據綁定的區別,還有就是MVC中Controller充當中介讓M和V通信,MVVM中相當于把雙方的都拿來只讓M或V與VM交互,不讓M、V直接交互(MVVVM模式有著嚴格的規定,即View層與Model層不得直接進行通信)。