安卓應用開發(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ù)事件類型調(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ā)效率和質量符喝。??????

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末闪彼,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子协饲,更是在濱河造成了極大的恐慌畏腕,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,627評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件茉稠,死亡現(xiàn)場離奇詭異描馅,居然都是意外死亡,警方通過查閱死者的電腦和手機而线,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,180評論 3 399
  • 文/潘曉璐 我一進店門铭污,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人膀篮,你說我怎么就攤上這事嘹狞。” “怎么了誓竿?”我有些...
    開封第一講書人閱讀 169,346評論 0 362
  • 文/不壞的土叔 我叫張陵磅网,是天一觀的道長。 經(jīng)常有香客問我筷屡,道長涧偷,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,097評論 1 300
  • 正文 為了忘掉前任速蕊,我火速辦了婚禮嫂丙,結果婚禮上娘赴,老公的妹妹穿的比我還像新娘规哲。我一直安慰自己,他們只是感情好诽表,可當我...
    茶點故事閱讀 69,100評論 6 398
  • 文/花漫 我一把揭開白布唉锌。 她就那樣靜靜地躺著隅肥,像睡著了一般。 火紅的嫁衣襯著肌膚如雪袄简。 梳的紋絲不亂的頭發(fā)上腥放,一...
    開封第一講書人閱讀 52,696評論 1 312
  • 那天,我揣著相機與錄音绿语,去河邊找鬼秃症。 笑死,一個胖子當著我的面吹牛吕粹,可吹牛的內(nèi)容都是我干的种柑。 我是一名探鬼主播,決...
    沈念sama閱讀 41,165評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼匹耕,長吁一口氣:“原來是場噩夢啊……” “哼聚请!你這毒婦竟也來了?” 一聲冷哼從身側響起稳其,我...
    開封第一講書人閱讀 40,108評論 0 277
  • 序言:老撾萬榮一對情侶失蹤驶赏,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后既鞠,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體煤傍,經(jīng)...
    沈念sama閱讀 46,646評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,709評論 3 342
  • 正文 我和宋清朗相戀三年损趋,在試婚紗的時候發(fā)現(xiàn)自己被綠了患久。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,861評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡浑槽,死狀恐怖蒋失,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情桐玻,我是刑警寧澤篙挽,帶...
    沈念sama閱讀 36,527評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站镊靴,受9級特大地震影響铣卡,放射性物質發(fā)生泄漏。R本人自食惡果不足惜偏竟,卻給世界環(huán)境...
    茶點故事閱讀 42,196評論 3 336
  • 文/蒙蒙 一煮落、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧踊谋,春花似錦蝉仇、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,698評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽沉迹。三九已至,卻和暖如春害驹,著一層夾襖步出監(jiān)牢的瞬間鞭呕,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,804評論 1 274
  • 我被黑心中介騙來泰國打工宛官, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留葫松,地道東北人。 一個月前我還...
    沈念sama閱讀 49,287評論 3 379
  • 正文 我出身青樓底洗,卻偏偏與公主長得像进宝,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子枷恕,可洞房花燭夜當晚...
    茶點故事閱讀 45,860評論 2 361

推薦閱讀更多精彩內(nèi)容