MVC vs. MVP vs. MVVM
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
相關文章
- MVC——MVP——MVVMMVCMVPMVVM
- MVC,MVP,MVVMMVCMVPMVVM
- Airflow vs. Luigi vs. Argo vs. MLFlow vs. KubeFlowAIUIGo
- HashSet vs. TreeSet vs. LinkedHashSet
- 淺談MVC/MVP/MVVM模式(概述)MVCMVPMVVM模式
- 理解並運用MVC,MVP,MVVMMVCMVPMVVM
- MVC、MVP和MVVM的區別MVCMVPMVVM
- MVC、MVP和MVVM以及MVA比較MVCMVPMVVM
- MVC,MVP 和 MVVM 模式如何選擇?MVCMVPMVVM模式
- 不要再問我MVC、MVP、MVVM了MVCMVPMVVM
- MVC,MVP和MVVM之間的區別MVCMVPMVVM
- MVC、MVP、MVVM,我到底該怎麼選?MVCMVPMVVM
- 談談對MVC、MVP和MVVM的理解?MVCMVPMVVM
- iOS MVC、MVVM、MVP架構模式淺淺析iOSMVCMVVMMVP架構模式
- iOS架構淺談從 MVC、MVP 到 MVVMiOS架構MVCMVPMVVM
- 搞懂:資料科學vs.機器學習vs.資料分析vs.商業分析資料科學機器學習
- Ansible vs. TerraformORM
- Navigating Kubernetes Certification: CKAD vs. CKA vs. CKS, Including KCNA and KCSA
- Android 架構設計:MVC、MVP、MVVM和元件化Android架構MVCMVPMVVM元件化
- [譯]iOS架構模式——解密MVC、MVP、MVVM和VIPERiOS架構模式解密MVCMVPMVVM
- 【譯】GraphQL vs. RESTREST
- Spring WebClient vs. RestTemplateSpringWebclientREST
- Quarkus vs. SpringBoot - RedditSpring Boot
- 大資料檔案格式比較:AVRO vs. PARQUET vs. ORC大資料VR
- iOS架構設計:揭祕MVC, MVP, MVVM以及VIPERiOS架構MVCMVPMVVM
- Redis vs. MongoDB比較RedisMongoDB
- 柏拉圖洞穴寓言 vs. AI表徵假說 vs. 表觀遺傳AI
- 幽默meme:如何提問題 Vs. 樂觀答題 Vs. 悲觀答題
- Ruby on Rails Mountable vs. Full EngineAI
- 模板 vs. 硬編碼 HTMLHTML
- MVC、MVP、MVVM,談談我對Android應用架構的理解MVCMVPMVVMAndroid應用架構
- iOS底層原理 MVC、MVP、MVVM、分層設計淺談 — (13)iOSMVCMVPMVVM
- Linux vs. Unix:有什麼不同?Linux
- 軟連結 vs. 硬連結
- MVC、MVCS、MVVM、MVP、VIPER等這麼多架構模式哪一個好呢?MVCMVVMMVP架構模式
- Apple M1 vs. M1 Pro vs. M1 Max:Apple 的新晶片有多快?APP晶片
- 傳統量化策略 VS. AI量化策略AI
- machine learning model(algorithm model) .vs. statistical modelMacGo
- [譯] React Native vs. Cordova、PhoneGap、Ionic,等等React Native