Android MVVM 解讀 2.MVC, MVP, MVVM

Android MVVM background info

包含的信息

  1. MVC, MVP, MVVM的介紹
  2. MVC, MVP, MVVM的區(qū)別

1. MVC, MVP, MVVM的介紹

MVC, MVP和MVVM的區(qū)別和聯(lián)系,是一個老生常談的問題, 這里也不過多的進行描述

可以先查看下以下的兩個鏈接:

MVC,MVP 和 MVVM 模式如何選擇?
你真的理解了MVC, MVP, MVVM嗎?

其中第一篇文章是比較偏理論的分析, 第二篇文章中,在介紹時,包含了一些實際的案例

看完這兩篇文章,可以總結如下:

1.1 MVC

1.1.1 類圖

MVC類圖

1.1.2. 活動圖

MVC活動圖

1.1.3. 依賴關系

  1. View 持有Controller和Model

    • 持有Controller用于向Controller發(fā)送命令,比如點擊UI上的button時,觸發(fā)的事件
    • 持有Model,是用于向Model注冊監(jiān)聽Model變化的Observer
  2. Controller 持有Model, 在Controller收到View的命令后,處理相關的邏輯后,向Model發(fā)送事件

  3. Model 不持有Controller,也不持有View, 在收到命令后,執(zhí)行命令,并且向注冊自身監(jiān)聽器的對象發(fā)送事件,此處的監(jiān)聽器對象是View

1.1.4 優(yōu)缺點總結(來自: https://zhuanlan.zhihu.com/p/38108311)

  1. 優(yōu)點

    1、把業(yè)務邏輯全部分離到Controller中,模塊化程度高。當業(yè)務邏輯變更的時候,不需要變更View和Model,只需要Controller換成另外一個Controller就行了(Swappable Controller)。
    2、觀察者模式可以做到多視圖同時更新。

  2. 缺點

    1、Controller測試困難。因為視圖同步操作是由View自己執(zhí)行,而View只能在有UI的環(huán)境下運行。在沒有UI環(huán)境下對Controller進行單元測試的時候,Controller業(yè)務邏輯的正確性是無法驗證的:Controller更新Model的時候,無法對View的更新操作進行斷言。
    2、View無法組件化。View是強依賴特定的Model的,如果需要把這個View抽出來作為一個另外一個應用程序可復用的組件就困難了。因為不同程序的的Domain Model是不一樣的.

1.2 MVP

1.2.1. 類圖

MVP Class Diagram

1.2.2. 活動圖

MVP Activity

1.2.3 依賴關系

  1. View持有Presenter

    • 持有Presenter, 用于向Presenter發(fā)送命令
  2. Presenter持有View和Model

    • Presenter持有Model, 用于向Model發(fā)送命令,并且接收Model的回調(diào)通知
    • Presenter持有View,用于通知更新UI
  3. Model即不持有Presenter,也不持有View

    • 在收到命令后,執(zhí)行結束后,通知callback回調(diào)或者在監(jiān)聽注冊的基礎上通知

1.2.4 優(yōu)缺點總結(來自: https://zhuanlan.zhihu.com/p/38108311)

  1. 優(yōu)點

1、便于測試。Presenter對View是通過接口進行,在對Presenter進行不依賴UI環(huán)境的單元測試的時候??梢酝ㄟ^Mock一個View對象,這個對象只需要實現(xiàn)了View的接口即可。然后依賴注入到Presenter中,單元測試的時候就可以完整的測試Presenter業(yè)務邏輯的正確性。這里根據(jù)上面的例子給出了Presenter的單元測試樣例。
2、View可以進行組件化。在MVP當中,View不依賴Model。這樣就可以讓View從特定的業(yè)務場景中脫離出來,可以說View可以做到對業(yè)務邏輯完全無知。它只需要提供一系列接口提供給上層操作。這樣就可以做高度可復用的View組件。

  1. 缺點

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

1.3 MVVM

1.3.1 類圖

MVVM 類圖

1.3.2 活動圖

在這里插入圖片描述

1.3.3 依賴關系

  1. DataBinding 持有View具體的多個具體的View, DataBinding持有ViewModel

    • DataBinding 是一個框架, 在View中進行聲明,針對某一個具體的View和具體的ViewModel的dataBinding便可以生成
    • 通過在View中的聲明, DataBinding可以生成View的事件,自動綁定到ViewModel的調(diào)用方法
    • 通過在View中的聲明, DataBinding可以生成ViewModel的具體field的觀察者,在ViewModel的field發(fā)生變化后,回調(diào)給DataBinding,dataBinding的觀察者,自動通知更新到View的UI上
  2. View 持有DataBinding

    • View通過聲明,便關聯(lián)到某一個具體的ViewModel
    • View通過聲明,自動生成一個和View,以及聲明的ViewModel相關的DataBinding
    • View在聲明后,初始化時,找到DataBinding,然后給DataBinding,綁定ViewModel,便可以運作
  1. ViewModel 持有Model, 不持有DataBinding和View

    • ViewModel暴露的方法中,在方法被調(diào)用時,ViewModel調(diào)用Model的方法,Model的數(shù)據(jù)變更后,主動引起ViewModel的數(shù)據(jù)變更,而ViewModel的數(shù)據(jù)變更,便會被DataBinding監(jiān)聽到,進而引起UI的變化
  2. Model 不持有任何的模型

    • Model的方法返回的是可被observe的數(shù)據(jù),ViewModel可以持有此observe數(shù)據(jù),作為數(shù)據(jù)源,或者根據(jù)此數(shù)據(jù)源再包裹一個observe作為引用不變的數(shù)據(jù)源,方便DataBinding引用

1.3.4 優(yōu)缺點總結(來自: https://zhuanlan.zhihu.com/p/38108311)

  1. 優(yōu)點

1、提高可維護性。解決了MVP大量的手動View和Model同步的問題,提供雙向綁定機制。提高了代碼的可維護性。
2、簡化測試。因為同步邏輯是交由Binder做的,View跟著Model同時變更,所以只需要保證Model的正確性,View就正確。大大減少了對View同步更新的測試。

  1. 缺點

1、過于簡單的圖形界面不適用,或說牛刀殺雞。
2、對于大型的圖形應用程序,視圖狀態(tài)較多,ViewModel的構建和維護的成本都會比較高。
3、數(shù)據(jù)綁定的聲明是指令式地寫在View的模版當中的,這些內(nèi)容是沒辦法去打斷點debug的。

2. MVC, MVP, MVVM的區(qū)別

2.1 演進

  1. 從MVC 到 MVP , 主要解決了三者相互依賴的問題
  2. 從MVP 到 MVVM, 主要解決了Presenter到View的手動更新的問題, 但是因此卻帶來了一個新的框架DataBinding的部分,學習成本增加了

2.2 選擇使用篇

  1. 小型的UI工程,其實可選用MVP, 如果選用MVVM的話,需要引用新的框架DataBinding,學習成本比較高
  2. 對于稍微偏中型的UI工程,可選用MVVM
  3. 對于大型復雜的UI界面,是需要將大型的UI界面,進行模塊的拆分,拆分后,可使用MVVM,或者MVP
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容