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ù)事件類型調(diào)用相應的業(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ù)衫画,并提供相應的方法供控制器調(diào)用。
視圖層:通常是一個XML布局文件瓮栗,定義了應用程序的用戶界面削罩,如按鈕瞄勾、文本框等。視圖層可以響應用戶的操作弥激,并將事件傳遞給控制器进陡。
控制器層:通常是一個Activity或Fragment類,實現(xiàn)了應用程序的業(yè)務邏輯微服,如登錄趾疚、注冊、購物等以蕴〔诼螅控制器層可以根據(jù)視圖傳來的事件調(diào)用相應的數(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ù)事件類型調(diào)用相應的業(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ù)诲侮,并提供相應的方法供邏輯層調(diào)用。
視圖層:與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)這些方法尊浪,并將結果回調(diào)給Presenter類匣屡。Presenter類在構造函數(shù)中接收一個View Interface類型的參數(shù)封救,并通過調(diào)用該參數(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ù)事件類型調(diào)用相應的業(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ù)夺溢,并提供相應的方法供邏輯層調(diào)用。
視圖層:與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類中對應的方法被調(diào)用時尸红,會自動調(diào)用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ā)效率和質量符喝。??????