安卓應用開發(fā)中的MVC、MVP、MVVM、MVI(1)

1. 安卓應用開發(fā)中的MVC、MVP、MVVM、MVI

安卓應用開發(fā)是一個熱門而又復雜的領域,隨著技術的不斷進步和需求的不斷變化,安卓應用開發(fā)也需要不斷地優(yōu)化和改進。為了提高安卓應用開發(fā)的效率和質量,設計模式是一個重要而又必不可少的工具。設計模式可以幫助我們將程序分解為不同的模塊,實現(xiàn)模塊內(nèi)部的高內(nèi)聚和模塊之間的低耦合,從而提高代碼的可讀性、可維護性、可擴展性和可測試性。

在安卓應用開發(fā)中,最常見和最流行的設計模式有四種:MVC(Model-View-Controller)、MVP(Model-View-Presenter)、MVVM(Model-View-ViewModel)和MVI(Model-View-Intent)。這四種設計模式都是基于分層架構思想,將程序分為三層:數(shù)據(jù)層(Model)、視圖層(View)和邏輯層(Controller/Presenter/ViewModel/Intent)。數(shù)據(jù)層負責管理數(shù)據(jù)狀態(tài)和提供數(shù)據(jù)接口;視圖層負責展示用戶界面和接收用戶輸入;邏輯層負責處理業(yè)務邏輯和控制數(shù)據(jù)與視圖之間的交互。

雖然這四種設計模式都遵循了分層架構思想,但它們在具體實現(xiàn)上有著不同之處。本文將從以下幾個方面對比這四種設計模式:

  • 模塊之間的通信方式
  • 模塊之間的依賴關系
  • 模塊之間的職責劃分
  • 優(yōu)缺點分析
  • 適用場景

1.1 MVC

1.1.1 模塊之間的通信方式

在MVC設計模式中,視圖層直接與控制器層進行雙向通信,控制器層與數(shù)據(jù)層進行單向通信。如下圖所示:

當用戶對視圖進行操作時,視圖會將事件傳遞給控制器;控制器根據(jù)事件類型調用相應的業(yè)務邏輯,并更新數(shù)據(jù);數(shù)據(jù)變化后會通知控制器;控制器再根據(jù)數(shù)據(jù)變化更新視圖。

1.1.2 模塊之間的依賴關系

在MVC設計模式中,視圖依賴于控制器,控制器依賴于數(shù)據(jù)。如下圖所示:

由于視圖直接與控制器進行雙向通信,導致視圖與控制器緊密耦合。如果需要修改或替換其中一個組件,則需要同時修改或替換另一個組件。

1.1.3 模塊之間的職責劃分

在MVC設計模式中,數(shù)據(jù)層負責管理數(shù)據(jù)狀態(tài)和提供數(shù)據(jù)接口;視圖層負責展示用戶界面和接收用戶輸入;控制器層負責處理業(yè)務邏輯和控制數(shù)據(jù)與視圖之間的交互。

數(shù)據(jù)層:通常是一個Java Bean類,封裝了應用程序的核心數(shù)據(jù),如用戶信息、商品信息等。數(shù)據(jù)層可以從本地或遠程獲取或存儲數(shù)據(jù),并提供相應的方法供控制器調用。
視圖層:通常是一個XML布局文件,定義了應用程序的用戶界面,如按鈕、文本框等。視圖層可以響應用戶的操作,并將事件傳遞給控制器。
控制器層:通常是一個Activity或Fragment類,實現(xiàn)了應用程序的業(yè)務邏輯,如登錄、注冊、購物等??刂破鲗涌梢愿鶕?jù)視圖傳來的事件調用相應的數(shù)據(jù)方法,并根據(jù)數(shù)據(jù)變化更新視圖。
1.1.4 優(yōu)缺點分析
MVC設計模式是最早也是最簡單的一種分層架構思想,它有以下優(yōu)點:

簡單易懂,容易上手
將程序分為三個模塊,實現(xiàn)了一定程度上的解耦
有利于代碼復用和維護
但MVC設計模式也有以下缺點:

視圖與控制器緊密耦合,不利于測試和擴展
控制器過于臃腫,承擔了太多職責
數(shù)據(jù)變化后需要手動更新視圖

1.1.5 適用場景

MVC設計模式適合于簡單小型的安卓應用開發(fā),當業(yè)務邏輯不復雜且視圖變化不頻繁時,可以使用MVC設計模式快速開發(fā)出可運行的應用。

1.2 MVP

1.2.1 模塊之間的通信方式

在MVP設計模式中,視圖層與邏輯層進行雙向通信,邏輯層與數(shù)據(jù)層進行單向通信。如下圖所示:

當用戶對視圖進行操作時,視圖會將事件傳遞給邏輯層;邏輯層根據(jù)事件類型調用相應的業(yè)務邏輯,并更新數(shù)據(jù);數(shù)據(jù)變化后會通知邏輯層;邏輯層再根據(jù)數(shù)據(jù)變化更新視圖。

1.2.2 模塊之間的依賴關系

在MVP設計模式中,視圖依賴于接口(View Interface),而不是具體實現(xiàn)(Presenter);同樣地,邏輯層也依賴于接口(Model Interface),而不是具體實現(xiàn)(Model)。如下圖所示:

由于視圖和邏輯層都通過接口進行通信,導致視圖和邏輯層松散耦合。如果需要修改或替換其中一個組件,則不需要同時修改或替換另一個組件。

1.2.3 模塊之間的職責劃分

在MVP設計模式中,數(shù)據(jù)層負責管理數(shù)據(jù)狀態(tài)和提供數(shù)據(jù)接口;視圖層負責展示用戶界面和接收用戶輸入;邏輯層負責處理業(yè)務邏輯和控制數(shù)據(jù)與視圖之間的交互。

數(shù)據(jù)層:與MVC設計模式中的數(shù)據(jù)層相同,通常是一個Java Bean類,封裝了應用程序的核心數(shù)據(jù),如用戶信息、商品信息等。數(shù)據(jù)層可以從本地或遠程獲取或存儲數(shù)據(jù),并提供相應的方法供邏輯層調用。
視圖層:與MVC設計模式中的視圖層相似,通常是一個XML布局文件,定義了應用程序的用戶界面,如按鈕、文本框等。但不同的是,視圖層不直接與邏輯層進行通信,而是通過定義一個View Interface接口來規(guī)范視圖與邏輯之間的交互。View Interface接口定義了一些抽象方法,如showLoading()、showError()、showData()等,由具體的Activity或Fragment類來實現(xiàn)這些方法,并將自身作為參數(shù)傳給Presenter類。
邏輯層:與MVC設計模式中的控制器層相似,通常是一個Presenter類,實現(xiàn)了應用程序的業(yè)務邏輯,如登錄、注冊、購物等。但不同的是,邏輯層不直接與視圖層進行通信,而是通過定義一個Model Interface接口來規(guī)范邏輯與數(shù)據(jù)之間的交互。Model Interface接口定義了一些抽象方法,如login()、register()、buy()等,由具體的Model類來實現(xiàn)這些方法,并將結果回調給Presenter類。Presenter類在構造函數(shù)中接收一個View Interface類型的參數(shù),并通過調用該參數(shù)的方法來更新視圖。

1.2.4 優(yōu)缺點分析

MVP設計模式是對MVC設計模式的改進,它有以下優(yōu)點:

視圖與邏輯層松散耦合,利于測試和擴展
邏輯層更加清晰,職責更加單一
數(shù)據(jù)變化后可以自動更新視圖
但MVP設計模式也有以下缺點:

需要定義多個接口,增加了代碼量和復雜度
視圖與邏輯層仍然存在雙向通信,不利于數(shù)據(jù)流的追蹤和管理

1.2.5 適用場景

MVP設計模式適合于中等復雜度的安卓應用開發(fā),當業(yè)務邏輯較為復雜且視圖變化較為頻繁時,可以使用MVP設計模式提高代碼的可讀性、可維護性、可擴展性和可測試性。

1.3 MVVM

1.3.1 模塊之間的通信方式

在MVVM設計模式中,視圖層與邏輯層進行單向通信,邏輯層與數(shù)據(jù)層進行雙向通信。如下圖所示:

當用戶對視圖進行操作時,視圖會將事件傳遞給邏輯層;邏輯層根據(jù)事件類型調用相應的業(yè)務邏輯,并更新數(shù)據(jù);數(shù)據(jù)變化后會自動同步到邏輯層;邏輯層再根據(jù)數(shù)據(jù)變化自動更新視圖。

1.3.2 模塊之間的依賴關系

在MVVM設計模式中,視圖依賴于邏輯層(ViewModel),而不是接口(View Interface);邏輯層依賴于數(shù)據(jù)層(Model),而不是接口(Model Interface)。如下圖所示:

由于視圖和邏輯層之間通過數(shù)據(jù)綁定進行通信,導致視圖和邏輯層完全解耦。如果需要修改或替換其中一個組件,則不需要同時修改或替換另一個組件。

1.3.3 模塊之間的職責劃分

在MVVM設計模式中,數(shù)據(jù)層負責管理數(shù)據(jù)狀態(tài)和提供數(shù)據(jù)接口;視圖層負責展示用戶界面和接收用戶輸入;邏輯層負責處理業(yè)務邏輯和控制數(shù)據(jù)與視圖之間的交互。

數(shù)據(jù)層:與MVC和MVP設計模式中的數(shù)據(jù)層相同,通常是一個Java Bean類,封裝了應用程序的核心數(shù)據(jù),如用戶信息、商品信息等。數(shù)據(jù)層可以從本地或遠程獲取或存儲數(shù)據(jù),并提供相應的方法供邏輯層調用。
視圖層:與MVC和MVP設計模式中的視圖層相似,通常是一個XML布局文件,定義了應用程序的用戶界面,如按鈕、文本框等。但不同的是,視圖層不直接與邏輯層進行通信,而是通過使用Data Binding庫來實現(xiàn)視圖與邏輯之間的自動同步。Data Binding庫可以將XML布局文件中的UI組件與ViewModel類中的屬性或方法進行綁定,并在兩者之間建立一個觀察者模式。當UI組件發(fā)生變化時,會自動觸發(fā)ViewModel類中對應的方法;當ViewModel類中對應的屬性發(fā)生變化時,會自動更新UI組件。
邏輯層:與MVC和MVP設計模式中的控制器層和Presenter層相似,通常是一個ViewModel類,實現(xiàn)了應用程序的業(yè)務邏輯,如登錄、注冊、購物等。但不同的是,邏輯層不直接與視圖層進行通信,而是通過使用LiveData庫來實現(xiàn)邏輯與數(shù)據(jù)之間的自動同步。LiveData庫可以將ViewModel類中的屬性或方法與Model類中的屬性或方法進行綁定,并在兩者之間建立一個觀察者模式。當Model類中對應的屬性發(fā)生變化時,會自動更新ViewModel類中對應的屬性;當ViewModel類中對應的方法被調用時,會自動調用Model類中對應的方法。

1.3.4 優(yōu)缺點分析

MVVM設計模式是對MVP設計模式的改進,它有以下優(yōu)點:

視圖與邏輯層完全解耦,利于測試和擴展
邏輯層更加清晰,職責更加單一
數(shù)據(jù)變化后可以自動更新視圖和邏輯
代碼量更少,復雜度更低
但MVVM設計模式也有以下缺點:

需要使用第三方庫來實現(xiàn)數(shù)據(jù)綁定和數(shù)據(jù)同步
數(shù)據(jù)流不易追蹤和管理

1.3.5 適用場景

MVVM設計模式適合于復雜大型的安卓應用開發(fā),當業(yè)務邏輯非常復雜且視圖變化非常頻繁時,可以使用MVVM設計模式提高代碼的可讀性、可維護性、可擴展性和可測試性。

1.4 MIVI

請參考我的另一篇文章,我想把MVI講的詳細一些。
安卓應用開發(fā)中的MVC、MVP、MVVM、MVI(2) - 簡書 (jianshu.com)

1.5 總結

本文介紹了三種常見的安卓開發(fā)設計模式:MVC、MVP和MVVM,并分別從模塊之間的通信方式、依賴關系、職責劃分、優(yōu)缺點分析和適用場景等方面進行了比較。希望本文能夠幫助讀者理解并選擇合適的設計模式來提高安卓開發(fā)效率和質量。??????

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

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

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