Android中對MVC、MVP、MVVM的理解和分析

MVC

MVC 全名是 Model--View--Controller,是模型(model)-視圖(view)-控 制器(controller)的縮寫,一種軟件設計典範,用一種業務邏輯、數據、界 面顯示分離的方法組織代碼,在改進和個性化定製界面及用戶交互的同 時,不需要重新編寫業務邏輯。其中 Model 層處理數據,業務邏輯等; View 層處理界面的顯示結果Controller 層起到橋樑的作用,來控制 View 層和 Model 層通信以此來達到分離視圖顯示和業務邏輯層。

我們往往把 Android 中界面部分的實現也理解爲採用了 MVC 框架,常常 把 Activity 理解爲 MVC 模式中的 Controller。

看似沒有什麼特別的地方,但是由幾個需要特別關注的關鍵點:

1、View 是把控制權交移給 Controller,自己不執行業務邏輯。

2、Controller 執行業務邏輯並且操作 Model,但不會直接操作 View,可 以說它是對 View 無知的。

3、View 和 Model 的同步消息是通過觀察者模式進行,而同步操作是由 View 自己請求 Model 的數據然後對視圖進行更新。

MVC 的優缺點

  優點:

          1、把業務邏輯全部分離到 Controller 中,模塊化程度高。當業務邏輯 變更的時候,不需要變更 View 和 Model, 只需要                    Controller 換 成另外一個 Controller 就行了(Swappable Controller)。

         2、觀察者模式可以做到多視圖同時更新。

  缺點:

          1、Controller 測試困難。因爲視圖同步操作是由 View 自己執行 而 View 只能在有 UI 的環境下運行。在沒有 UI 環境下對                    Controller 進行 單元測試的時候, Controller 業務邏輯的正確性是無法驗證的:Controller 更新 Model 的時候,無法對                  View 的更新操作進行斷言。

         2、View 無法組件化。View 是強依賴特定的 Model 的,如果需要把這 View 抽出來作爲一個另外一個應用程序可複用的組                件就困難了。 因爲不同程序的的 Domain Model 是不一樣的

MVP

MVP 其實是 MVC 的一種演進版本,它更簡單,將 MVC 中的 Controller 改爲了 Presenter, View 通過接口與 Presenter 進行交互,降低耦合,方便進行單元測試。 View:負責繪製 UI 元素、與用戶進行交互(Activity、View、Fragment 都可以做爲 View 層); Model:對數據的操作、對網絡等的操作,和業務相關的邏輯處理; Presenter:作爲 View 與 Model 交互的中間紐帶,處理與用戶交互的邏輯。可以把 Presenter 理解爲一箇中間層的角色,它接受 Model 層的數據,並且處理之後傳遞給 View 層,還需要 處理 View 層的用戶交互等操作。

關鍵點:

1、View 不再負責同步的邏輯,而是由 Presenter 負責。Presenter 中既有業務邏輯也有同步邏輯。

2、View 需要提供操作界面的接口給 Presenter 進行調用。(關鍵) 對比在 MVC 中,Controller 是不能操作 View 的,View 也沒有提供相應的接口;而在 MVP 當中,Presenter 可以操作 View,View 需要提供一組對界面操作的接口給 Presenter 進行調 用;Model 仍然通過事件廣播自己的變更,但由 Presenter 監聽而不是 View。

MVP(Passive View)的優缺點

優點:

1、便於測試。Presenter 對 View 是通過接口進行,在對 Presenter 進行不依賴 UI 環境的單元測試的時 候。可以通過 Mock 一個 View 對象,這個對象只需要實現了 View 的接口即可。然後依賴注入到 Presenter 中,單元測試的時候就可以完整的測試 Presenter 業務邏輯的正確性。

2、View 可以進行組件化。在 MVP 當中,View 不依賴 Model。這樣就可以讓 View 從特定的業務場景中脫 離出來,可以說 View 可以做到對業務邏輯完全無知。它只需要提供一系列接口提供給上層操作。這樣就可 以做高度可複用的 View 組件。

缺點:

1、Presenter 中除了業務邏輯以外,還有大量的 View->Model,Model->View 的手動同步邏輯,造成 Presenter 比較笨重,維護起來會比較困難。

MVVM

MVVM 模式(Model--View--ViewModel 模式),和 MVP 模式相比,MVVM 模式用 ViewModel 替換了 Presenter ,其他層基本上與 MVP 模式一致,ViewModel 可以理解成 是 View 的數據模型和 Presenter 的合體。 MVVM 採用雙向綁定(data-binding):View 的變動,自動反映在 ViewModel,反之亦然, 這種模式實際上是框架替應用開發者做了一些工作(相當於 ViewModel 類是由庫幫我們生 成的),開發者只需要較少的代碼就能實現比較複雜的交互。

 

MVVM 的調用關係

MVVM 的調用關係和 MVP 一樣。但是,在 ViewModel 當中會有一個叫 Binder,或者是 Data-binding engine 的東西。以前全部由 Presenter 負責的 View 和 Model 之間數據同步操 作交由給 Binder 處理。你只需要在 View 的模版語法當中,指令式地聲明 View 上的顯示的 內容是和 Model 的哪一塊數據綁定的。當 ViewModel 對進行 Model 更新的時候,Binder 會自動把數據更新到 View 上去,當用戶對 View 進行操作(例如表單輸入),Binder 也會 自動把數據更新到 Model 上去。這種方式稱爲:Two-way data-binding,雙向數據綁定。 可以簡單而不恰當地理解爲一個模版引擎,但是會根據數據變更實時渲染。

關鍵點:

MVVM 把 View 和 Model 的同步邏輯自動化了。以前 Presenter 負責的 View 和 Model 同步不再手動地進行 操作,而是交由框架所提供的 Binder 進行負責。 只需要告訴 Binder,View 顯示的數據對應的是 Model 哪一部分即可。

MVVM 的優缺點

優點:

1、提高可維護性。解決了 MVP 大量的手動 View 和 Model 同步的問題,提供雙向綁定機制。提高了代碼的可維護性。

2、簡化測試。因爲同步邏輯是交由 Binder 做的,View 跟 着 Model 同時變更,所以只需要保證 Model 的正確性,View 就正確。大大減少了對 View 同步更新的測試。

缺點:

1、過於簡單的圖形界面不適用,或說牛刀殺雞。

2、對於大型的圖形應用程序,視圖狀態較多,ViewModel 的構建和維護的成本都會比較高。

3、數據綁定的聲明是指令式地寫在 View 的模版當中的, 這些內容是沒辦法去打斷點 debug 的。

結語

可以看到,從 MVC->MVP->MVVM,就像一個打怪升級的過程。後者解決了前者遺留的問 題,把前者的缺點優化成了優點。同樣的 Demo 功能,代碼從最開始的一堆文件,優化成 了最後只需要 20 幾行代碼就完成。MV*模式之間的區分還是蠻清晰的,希望可以給對這些 模式理解比較模糊的同學帶來一些參考和思路。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章