安卓中的MVC,MVP,MVVM架構(gòu)

如何將我們的安卓應(yīng)用程序組織成相應(yīng)的邏輯部件這個(gè)問題已經(jīng)被討論了很長時(shí)間了屡立。目前大部分開發(fā)人員都拋棄了傳統(tǒng)的Model View Controller(MVC)架構(gòu)褂痰,而更青睞于更加模塊化亩进,更易于測試的新的架構(gòu)。

目前Model View Presenter (MVP) 以及Model View ViewModel (MVVM)這兩種新的架構(gòu)成為了被廣泛接受的替代方法缩歪。關(guān)于這兩個(gè)架構(gòu)孰優(yōu)孰劣的辯論從未停止過归薛,然而試圖證明一種架構(gòu)遠(yuǎn)優(yōu)于另一種架構(gòu)的觀點(diǎn)大多都是基于主觀的判斷。這篇文章希望盡可能地撇開主觀情感匪蝙,來理性地分析這三種架構(gòu)的價(jià)值和潛力苟翻,然后為您在開發(fā)時(shí)選擇合適的架構(gòu)時(shí)提供建議。

MVC

Model View Controller 架構(gòu)在宏觀上將應(yīng)用的分為三種邏輯部件骗污,每一種包含相應(yīng)的職責(zé)崇猫。

Model

Model對于一個(gè)應(yīng)用來說,通常包含了數(shù)據(jù)需忿,狀態(tài)和邏輯诅炉,是我們的應(yīng)用中的核心部件。它不會(huì)與View和Controller綁定屋厘,正因?yàn)檫@樣涕烧,通常模型的組件可以在不同的上下文中被復(fù)用。

View

View是對Model的展示汗洒,該部件的職責(zé)是渲染用戶圖形界面并在用戶與界面產(chǎn)生互動(dòng)時(shí)與Controller進(jìn)行交互议纯。通常,在MVC架構(gòu)中View部件不了解底層的Model部件溢谤,不清楚當(dāng)前的裝態(tài)是什么也不知道當(dāng)用戶進(jìn)行操作時(shí)邏輯上究竟會(huì)發(fā)生什么變化瞻凤。但這正是MVC架構(gòu)的優(yōu)勢憨攒,View與業(yè)務(wù)邏輯的耦合越低就越靈活。

Controller

Controller是整個(gè)應(yīng)用的粘合劑阀参,當(dāng)View通知Controller用戶做出了一些操作時(shí)肝集,由Controller負(fù)責(zé)決定如何與相應(yīng)的Model交互。同時(shí)蛛壳,當(dāng)Model的數(shù)據(jù)發(fā)生改變時(shí)杏瞻,Controller負(fù)責(zé)根據(jù)這些數(shù)據(jù)的變化來決定更新相應(yīng)的View的狀態(tài)。在安卓應(yīng)用中Controller通常Activity和Fragment實(shí)現(xiàn)衙荐。

評價(jià)

MVC架構(gòu)很好地分離了model和view捞挥,但是controller存在以下問題:

  • 可測試性:controller與安卓API綁定而難以進(jìn)行單元測試

  • 模塊化和靈活性:controller與view的高度耦合導(dǎo)致view修改時(shí)我們往往需要修改controller

  • 可維護(hù)性:隨著應(yīng)用規(guī)模變大,越來越多的代碼開始轉(zhuǎn)移到控制器中忧吟,使得它們變得笨重和脆弱砌函。

如何解決這些問題呢?MVP提供了方案瀑罗。

MVP

Model

與MVC一樣

View

View唯一的變化在于胸嘴,現(xiàn)在的Activity/Fragment被視為view的一部分。我們不再試圖對抗他們緊密耦合的自然趨勢斩祭。一種好的做法是讓Activity實(shí)現(xiàn)view接口劣像,這樣Presenter就會(huì)可以針對接口編程。這消除了將其耦合到任何特定view摧玫,并允許對view的mock實(shí)現(xiàn)進(jìn)行簡單的單元測試耳奕。

Presenter

Presenter實(shí)際上是來自MVC的控制器,只不過它不再與View耦合诬像,只是一個(gè)接口屋群。這解決了MVC的可測試性問題以及模塊化/靈活性問題。實(shí)際上坏挠,MVP純粹主義者會(huì)爭辯說芍躏,Presenter絕不應(yīng)該包含任何對Android API或代碼的引用。

評價(jià)

這種架構(gòu)更加簡潔降狠。只要視圖實(shí)現(xiàn)了相應(yīng)的接口对竣,我們可以輕松地對Presenter邏輯進(jìn)行單元測試,因?yàn)樗皇苋魏蜛ndroid特定視圖和API的限制榜配,也允許我們使用任何其他的視圖否纬。

問題

可維護(hù)性:Presenter,就像Controller一樣蛋褥,隨著時(shí)間的推移临燃,它們傾向于增加額外的業(yè)務(wù)邏輯。在某些時(shí)候,開發(fā)人員經(jīng)常會(huì)遇到難以分解的大型笨重的Presenter膜廊。

MVVM

Android的數(shù)據(jù)綁定使得MVVM架構(gòu)具有更易于測試和模塊化的優(yōu)點(diǎn)乏沸,同時(shí)還減少了我們必須編寫的連接視圖+模型的代碼。

Model

與MVC一樣

View

View以靈活的方式綁定到由viewModel暴露的可觀察的變量和操作溃论。

ViewModel

ViewModel負(fù)責(zé)包裝模型并準(zhǔn)備視圖所需的可觀察數(shù)據(jù)屎蜓。它還為視圖提供了將事件傳遞給模型的鉤子痘昌。然而钥勋,ViewModel并不與視圖綁定。

評估

單元測試變得更加容易辆苔,當(dāng)測試時(shí)算灸,只需要驗(yàn)證在模型更改時(shí)可觀察的變量是否被正確地設(shè)置。沒有必要像采用MVP架構(gòu)時(shí)那樣mock測試的視圖驻啤。

問題

可維護(hù)性:由于視圖可以綁定到變量和表達(dá)式菲驴,無關(guān)的展示邏輯會(huì)隨著時(shí)間的推移而蔓延,將大量添加XML中的代碼骑冗。為了避免這種情況赊瞬,應(yīng)當(dāng)直接從ViewModel獲取值,而不要從視圖綁定表達(dá)式中計(jì)算或推演它們贼涩。

總結(jié)

MVP和MVVM都比MVC更好地將應(yīng)用程序分解為模塊化的單用途組件巧涧,但它們也增加了您的應(yīng)用的復(fù)雜性。具有數(shù)據(jù)綁定的MVVM具有很強(qiáng)的吸引力遥倦,因?yàn)樗裱呦鄳?yīng)性的編程模型并產(chǎn)生較少的代碼谤绳。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市袒哥,隨后出現(xiàn)的幾起案子缩筛,更是在濱河造成了極大的恐慌,老刑警劉巖堡称,帶你破解...
    沈念sama閱讀 217,084評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件瞎抛,死亡現(xiàn)場離奇詭異,居然都是意外死亡却紧,警方通過查閱死者的電腦和手機(jī)桐臊,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,623評論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來啄寡,“玉大人豪硅,你說我怎么就攤上這事⊥ξ铮” “怎么了懒浮?”我有些...
    開封第一講書人閱讀 163,450評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我砚著,道長次伶,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,322評論 1 293
  • 正文 為了忘掉前任稽穆,我火速辦了婚禮冠王,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘舌镶。我一直安慰自己柱彻,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,370評論 6 390
  • 文/花漫 我一把揭開白布餐胀。 她就那樣靜靜地躺著哟楷,像睡著了一般。 火紅的嫁衣襯著肌膚如雪否灾。 梳的紋絲不亂的頭發(fā)上卖擅,一...
    開封第一講書人閱讀 51,274評論 1 300
  • 那天,我揣著相機(jī)與錄音墨技,去河邊找鬼惩阶。 笑死,一個(gè)胖子當(dāng)著我的面吹牛扣汪,可吹牛的內(nèi)容都是我干的断楷。 我是一名探鬼主播,決...
    沈念sama閱讀 40,126評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼私痹,長吁一口氣:“原來是場噩夢啊……” “哼脐嫂!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起紊遵,我...
    開封第一講書人閱讀 38,980評論 0 275
  • 序言:老撾萬榮一對情侶失蹤账千,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后暗膜,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體匀奏,經(jīng)...
    沈念sama閱讀 45,414評論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,599評論 3 334
  • 正文 我和宋清朗相戀三年学搜,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了娃善。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,773評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡瑞佩,死狀恐怖聚磺,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情炬丸,我是刑警寧澤瘫寝,帶...
    沈念sama閱讀 35,470評論 5 344
  • 正文 年R本政府宣布蜒蕾,位于F島的核電站,受9級特大地震影響焕阿,放射性物質(zhì)發(fā)生泄漏咪啡。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,080評論 3 327
  • 文/蒙蒙 一暮屡、第九天 我趴在偏房一處隱蔽的房頂上張望撤摸。 院中可真熱鬧,春花似錦褒纲、人聲如沸准夷。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,713評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽冕象。三九已至代承,卻和暖如春汁蝶,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背论悴。 一陣腳步聲響...
    開封第一講書人閱讀 32,852評論 1 269
  • 我被黑心中介騙來泰國打工掖棉, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人膀估。 一個(gè)月前我還...
    沈念sama閱讀 47,865評論 2 370
  • 正文 我出身青樓幔亥,卻偏偏與公主長得像,于是被迫代替她去往敵國和親察纯。 傳聞我的和親對象是個(gè)殘疾皇子帕棉,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,689評論 2 354

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