1. 程式人生 > >MVC、MVP、MVVM 三者解析 區別與聯絡

MVC、MVP、MVVM 三者解析 區別與聯絡

理想的MVC模式中VC之間沒有直接依賴(沒有單向依賴),但現實中做不到。Native應用要一般由View分發事件給Controller,Controller要決定那些View使用者可見。

Web應用中情況好一點。使用者可以直接通過url直接訪問Controller,不需要View知道Controller,但是Controller還負責路由View。前端複雜化後,頁面上與Controller互動更頻繁,Controller也很難只通過url來實現了。

事實上MVC有三個問題:
1. V和M之間不匹配,使用者介面和流程要考慮易用性,使用者體驗優化同時考慮業務流程的精確和無錯。
2. C和M之間界線不清,什麼樣的邏輯是介面邏輯,什麼樣的邏輯是業務邏輯,很難定義清楚。
3. V的變化不能完全由Model控制,即Observer模式不足以支援複雜的使用者互動。這其實要求VC之間要有依賴。

後來的MVP與MVVM都是為了優化VC之間的關係而提出的。
MVP認為VC之間強繫結不可避免,但可以加強P的能力。V變成只顯示,P提供資料給V,把雙向依賴簡化為P直接依賴於V。
由於V的資料由P提供,則MV之間的Observer關係轉移到MP之間。

MVP主要解決1、3兩個問題,但代價是加重了問題2,P更重,而且與Model耦合無法框架化。且實踐中View很難完全被動化,它總是會隨使用者的事件變化,這部分成為P的負擔。

而MVVM則是另一個方面來解決問題。MVVM認為View應該是事件驅動,模型變化只是一種事件。C應該只處理View與模型不配合的問題,而問題3可以通過分離使用者互動與介面構造。C退化為一個View的模型VM,它與View之間由框架提供事件-資料的繫結。

MVVM與MVP相比主要徹底解決了問題1,重新定義了問題2,在MVVM中VM的功能比較明確,把M翻譯成View需要的資料。VM有一定檢視的屬性,View與VM有對應關係,也就解決一部分問題3。但是由於各角色職責已經定義,需要引入第四個元件來解決這個問題。

我們可以打個分,直接依賴計為1,間接依賴計為0.5
- 全部互相依賴是6。
- 理想MVC,MV=1.5,MC=1,共2.5。
- 現實MVC根據VC之間的依賴情況可能是0.5~2,實際是3~4.5。
- MVP,MP=1.5,VP=1,MV=0,共2.5。與理想情況一致。
- MVVM,MVM=1.5,VM+V=0.5~1,共2~2.5,即不高於理想MVC。

原文出自阮一峰的博文(MVC,MVP 和 MVVM 的圖示)評論區網友anthony發表的評論,經排版優化後發此博文記錄。