MVC篙顺、MVP、MVVM充择、MVI架構(gòu)區(qū)別

在過去的幾年里德玫,出現(xiàn)了幾種新的模式,所有這些模式都被譽(yù)為讓開發(fā)人員的生活變得前所未有的輕松椎麦。 通過分離代碼庫的某些部分宰僧,每種模式都試圖使代碼更具可讀性,更易于測(cè)試观挎,并最終更易于維護(hù)琴儿。在這篇文章中,我將討論軟件架構(gòu)設(shè)計(jì)模式:MVC嘁捷、MVP造成、MVVM、MVI 雄嚣。

架構(gòu)無分好壞晒屎,而是是否更適合項(xiàng)目的開發(fā)要求喘蟆。

1. MVC

Model:實(shí)體類(數(shù)據(jù)的獲取、存儲(chǔ)鼓鲁、數(shù)據(jù)狀態(tài)變化)蕴轨。
View:布局文件
Controller:Activity(處理數(shù)據(jù)、業(yè)務(wù)和UI)骇吭。

事件流向:

View接受用戶的交互請(qǐng)求橙弱。
View將請(qǐng)求轉(zhuǎn)交給Controller。
Controller操作Model進(jìn)行數(shù)據(jù)更新燥狰。
數(shù)據(jù)更新之后膘螟,Model通知View數(shù)據(jù)變化。
View顯示更新之后的數(shù)據(jù)碾局。

MVC的缺點(diǎn)

隨著界面及其邏輯的復(fù)雜度不斷提升荆残,Activity類的職責(zé)不斷增加,以致變得龐大臃腫净当。為了解決MVC的缺點(diǎn)内斯,MVP 框架被提出來。

2. MVP

Model:實(shí)體類(數(shù)據(jù)的獲取像啼、存儲(chǔ)俘闯、數(shù)據(jù)狀態(tài)變化)。
View:布局文件+Activity忽冻。
Presenter:中介真朗,負(fù)責(zé)完成View與Model間的交互和業(yè)務(wù)邏輯。

事件流向:
View 接收用戶交互請(qǐng)求
View 將請(qǐng)求轉(zhuǎn)交給 Presenter(V調(diào)用P接口)
Presenter 操作Model進(jìn)行數(shù)據(jù)更新(P調(diào)用M接口)
Model 通知Presenter數(shù)據(jù)發(fā)生變化(M調(diào)用P接口)
Presenter 更新View數(shù)據(jù)(P執(zhí)行接口,V相應(yīng)回調(diào))

MVP的優(yōu)點(diǎn)

復(fù)雜的邏輯處理放在Presenter進(jìn)行處理僧诚,減少了Activity的臃腫遮婶。
解耦。Model層與View層完全分離湖笨,修改V層不會(huì)影響M層旗扑,降低了耦合性。
可以將一個(gè)Presenter用于多個(gè)視圖慈省,而不需要改變Presenter的邏輯臀防。

MVP的缺點(diǎn)

維護(hù)困難。Presenter中除了業(yè)務(wù)邏輯以外边败,還有大量的View->Model袱衷,Model->View的手動(dòng)同步邏輯,造成Presenter比較笨重笑窜,維護(hù)起來會(huì)比較困難致燥。
接口膨脹

Presenter層通過接口與View通信,實(shí)際上持有了View的引用
但是隨著業(yè)務(wù)邏輯的增加怖侦,一個(gè)頁面可能會(huì)非常復(fù)雜篡悟,這樣就會(huì)造成View的接口會(huì)很龐大谜叹。

MVC和MVP的區(qū)別
  • MVC是允許Model和View進(jìn)行交互的,而MVP中很明顯搬葬,Model與View之間交互由Presenter完成荷腊;
  • MVC中V對(duì)應(yīng)的是布局文件,MVP中V對(duì)應(yīng)的是Activity急凰;

3. MVVM

Model:實(shí)體類(數(shù)據(jù)的獲取女仰、存儲(chǔ)、數(shù)據(jù)狀態(tài)變化)抡锈。
View:布局文件+Activity疾忍。
ViewModel: 關(guān)聯(lián)層,將Model和View進(jìn)行綁定床三,Model或View更改時(shí)一罩,實(shí)時(shí)刷新對(duì)方。

事件流向:

View 接收用戶交互請(qǐng)求
View 將請(qǐng)求轉(zhuǎn)交給ViewModel
ViewModel 操作Model數(shù)據(jù)更新
Model 更新完數(shù)據(jù)撇簿,通知ViewModel數(shù)據(jù)發(fā)生變化
ViewModel 更新View數(shù)據(jù)

即:
View/Model的變動(dòng)聂渊,只要改其中一方,另一方都能夠及時(shí)更新到四瘫。

MVVM的優(yōu)點(diǎn)

1.提高可維護(hù)性汉嗽。Data Binding可以實(shí)現(xiàn)雙向的交互,使得視圖和控制層之間的耦合程度進(jìn)一步降低找蜜,分離更為徹底饼暑,同時(shí)減輕了Activity的壓力。
2.DataBinding更多的是隱藏了Presenter層的回調(diào)細(xì)節(jié)洗做,MVVM其實(shí)有很多細(xì)節(jié)可以挖掘弓叛,如綁定的實(shí)現(xiàn)機(jī)制,是如何避免內(nèi)存泄漏等問題竭望。

MVVM的缺點(diǎn)

1.對(duì)于簡單的項(xiàng)目邪码,使用MVVM有點(diǎn)大材小用。
2.對(duì)于過大的項(xiàng)目咬清,數(shù)據(jù)綁定會(huì)導(dǎo)致內(nèi)存開銷大,影響性能奴潘。
3.ViewModel和View的綁定旧烧,使頁面異常追蹤變得不方便。有可能是View出錯(cuò)画髓,也有可能是ViewModel的業(yè)務(wù)邏輯有問題掘剪,也有可能是Model的數(shù)據(jù)出錯(cuò)。

MVVM與MVP的區(qū)別
  • 它采用雙向綁定(data-binding):View的變動(dòng)奈虾,自動(dòng)反映在 ViewModel夺谁,反之亦然廉赔。這樣開發(fā)者就不用處理接收事件,設(shè)置數(shù)據(jù)和View更新的工作匾鸥,框架已經(jīng)幫你做好了蜡塌,為開發(fā)節(jié)省了一大筆時(shí)間。

4. MVI

MVI 與 MVVM 很相似勿负,其借鑒了前端框架的思想馏艾,更加強(qiáng)調(diào)數(shù)據(jù)的單向流動(dòng)和唯一數(shù)據(jù)源,架構(gòu)圖如下所示

Model: 與MVVM中的Model不同的是,MVI的Model主要指UI狀態(tài)(State)奴愉。例如頁面加載狀態(tài)琅摩、控件位置等都是一種UI狀態(tài)
View: 與其他MVX中的View一致,可能是一個(gè)Activity或者任意UI承載單元锭硼。MVI中的View通過訂閱Model的變化實(shí)現(xiàn)界面刷新
Intent: 此Intent不是Activity的Intent房资,用戶的任何操作都被包裝成Intent后發(fā)送給Model層進(jìn)行數(shù)據(jù)請(qǐng)求

MVI強(qiáng)調(diào)數(shù)據(jù)的單向流動(dòng),主要分為以下幾步:

用戶操作以Intent的形式通知Model
Model基于Intent更新State
View接收到State變化刷新UI檀头。
數(shù)據(jù)永遠(yuǎn)在一個(gè)環(huán)形結(jié)構(gòu)中單向流動(dòng)志膀,不能反向流動(dòng):

MVI優(yōu)點(diǎn):
強(qiáng)調(diào)數(shù)據(jù)單向流動(dòng),很容易對(duì)狀態(tài)變化進(jìn)行跟蹤和回溯
使用ViewState對(duì)State集中管理鳖擒,只需要訂閱一個(gè) ViewState 便可獲取頁面的所有狀態(tài)溉浙,相對(duì) MVVM 減少了不少Livedata等多數(shù)數(shù)據(jù)的修改和監(jiān)聽。
ViewModel通過ViewState與Action通信蒋荚,通過瀏覽ViewState 和 Aciton 定義就可以理清 ViewModel 的職責(zé)戳稽,可以直接拿來作為接口文檔使用。

MVI缺點(diǎn):
所有的操作最終都會(huì)轉(zhuǎn)換成State期升,所以當(dāng)復(fù)雜頁面的State容易膨脹
state是不變的惊奇,因此每當(dāng)state需要更新時(shí)都要?jiǎng)?chuàng)建新對(duì)象替代老對(duì)象,這會(huì)帶來一定內(nèi)存開銷

MVI與MVVM區(qū)別
  • 強(qiáng)調(diào)數(shù)據(jù)單向流動(dòng)播赁,比雙向數(shù)據(jù)流動(dòng)更容易對(duì)狀態(tài)變化進(jìn)行跟蹤和回溯
  • 不用向mvvm那樣監(jiān)聽多個(gè)數(shù)據(jù)變化的更新而那么颂郎,使用ViewState對(duì)State集中管理,只需要訂閱一個(gè) ViewState 便可獲取頁面的所有狀態(tài)容为,更容易管理狀態(tài)

參考:
https://juejin.cn/post/7043716896767606798
https://blog.csdn.net/qjyws/article/details/122769834

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末乓序,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子坎背,更是在濱河造成了極大的恐慌替劈,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,590評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件得滤,死亡現(xiàn)場(chǎng)離奇詭異陨献,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)懂更,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,157評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門眨业,熙熙樓的掌柜王于貴愁眉苦臉地迎上來急膀,“玉大人,你說我怎么就攤上這事龄捡∽可” “怎么了?”我有些...
    開封第一講書人閱讀 169,301評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵墅茉,是天一觀的道長命黔。 經(jīng)常有香客問我,道長就斤,這世上最難降的妖魔是什么悍募? 我笑而不...
    開封第一講書人閱讀 60,078評(píng)論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮洋机,結(jié)果婚禮上坠宴,老公的妹妹穿的比我還像新娘。我一直安慰自己绷旗,他們只是感情好喜鼓,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,082評(píng)論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著衔肢,像睡著了一般庄岖。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上角骤,一...
    開封第一講書人閱讀 52,682評(píng)論 1 312
  • 那天隅忿,我揣著相機(jī)與錄音,去河邊找鬼邦尊。 笑死背桐,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的蝉揍。 我是一名探鬼主播链峭,決...
    沈念sama閱讀 41,155評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼又沾!你這毒婦竟也來了弊仪?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,098評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤捍掺,失蹤者是張志新(化名)和其女友劉穎撼短,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體挺勿,經(jīng)...
    沈念sama閱讀 46,638評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,701評(píng)論 3 342
  • 正文 我和宋清朗相戀三年喂柒,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了不瓶。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片禾嫉。...
    茶點(diǎn)故事閱讀 40,852評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖蚊丐,靈堂內(nèi)的尸體忽然破棺而出熙参,到底是詐尸還是另有隱情,我是刑警寧澤麦备,帶...
    沈念sama閱讀 36,520評(píng)論 5 351
  • 正文 年R本政府宣布孽椰,位于F島的核電站,受9級(jí)特大地震影響凛篙,放射性物質(zhì)發(fā)生泄漏黍匾。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,181評(píng)論 3 335
  • 文/蒙蒙 一呛梆、第九天 我趴在偏房一處隱蔽的房頂上張望锐涯。 院中可真熱鬧,春花似錦填物、人聲如沸纹腌。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,674評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽升薯。三九已至,卻和暖如春击困,著一層夾襖步出監(jiān)牢的瞬間涎劈,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,788評(píng)論 1 274
  • 我被黑心中介騙來泰國打工沛励, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留责语,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,279評(píng)論 3 379
  • 正文 我出身青樓目派,卻偏偏與公主長得像坤候,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子企蹭,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,851評(píng)論 2 361

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