關(guān)于Android架構(gòu)模式

為什么我們要使用架構(gòu)模式呢讥裤?

首先我們說(shuō)一下我們知道的Android有哪些呢借尿?
MVC MVP MVVM 三種架構(gòu)模式

我們使用架構(gòu)模式基本上都是為了降低耦合性 使Android工程師在開(kāi)發(fā)的時(shí)候只需要關(guān)注一點(diǎn)就可以,提高了工作的效率。

如果說(shuō)你認(rèn)為使用架構(gòu)模式就會(huì)讓你的代碼量變少的話,那你就大錯(cuò)特錯(cuò)了,使用架構(gòu)模式并不是說(shuō)讓你的代碼量變少,有時(shí)候還會(huì)比之前得代碼要多匀油。架構(gòu)模式是為了幫助我們?cè)谶壿嬌线叺母?jiǎn)單,很好的定義單一原則,下次修改的時(shí)候就可以直接找到某一個(gè)模塊進(jìn)行修改就可以锐极,大大的提高了我們工作的效率盒齿。方便定位問(wèn)題以及后續(xù)需求變更時(shí)不至于需要去改一大堆東西沿猜。

MVC

MVC (Model-View-Controller)我們最常見(jiàn)的架構(gòu) 也是很容易理解的

視圖層(View)

對(duì)應(yīng)于XML布局文件

控制層(Controller)

Android的控制層是由Activity來(lái)承擔(dān)的枚荣,Activity本來(lái)主要是作為初始化頁(yè)面,展示數(shù)據(jù)的操作啼肩,但是因?yàn)閄ML視圖功能太弱橄妆,所以Activity既要負(fù)責(zé)視圖的顯示又要加入控制邏輯,承擔(dān)的功能過(guò)多祈坠。

模型層(Model)

我們針對(duì)業(yè)務(wù)模型呼畸,建立的數(shù)據(jù)結(jié)構(gòu)和相關(guān)的類,它主要負(fù)責(zé)網(wǎng)絡(luò)請(qǐng)求颁虐,數(shù)據(jù)庫(kù)處理,I/O的操作卧须。

image.png

在Android 開(kāi)發(fā)當(dāng)中我們都知道Activity并不是控制層(Controller) 但是在這個(gè)模式中Activity卻被我們當(dāng)做控制層使用,本來(lái)它的首要職責(zé)是加載應(yīng)用的布局和初始化用戶界面另绩,接受并處理來(lái)自用戶的操作請(qǐng)求,進(jìn)而作出響應(yīng)花嘶。在MVC模式下隨著界面及其邏輯的復(fù)雜度不斷提升笋籽,Activity類的職責(zé)不斷增加,以致變得龐大臃腫椭员。

MVP

MVP 是 Model-View-Presenter

Model:

業(yè)務(wù)邏輯和實(shí)體模型车海,用來(lái)操作實(shí)際的數(shù)據(jù),包含 Bean 和 Model 的抽
象接口 來(lái)降低耦合隘击。

View:

就是 Android 中的視圖侍芝,需要建立一個(gè) View 的抽象接口 View Interface。
通過(guò)實(shí) 現(xiàn) View 的接口來(lái)實(shí)現(xiàn) View 與 Presenter 的交互埋同,從而降低耦合州叠。對(duì)應(yīng)于
Activity, 負(fù)責(zé) View 的繪制與用戶交互凶赁;

Presenter:

View 和 Model 的中間樞紐咧栗,處理和用戶交互的邏輯。

image.png
Activity/Fragment

只充當(dāng)視圖層虱肄,不做任何的業(yè)務(wù)邏輯致板,將業(yè)務(wù)邏輯全部放在
業(yè)務(wù)層,由 Presenter 和 Model 進(jìn)行交互咏窿,避免 Model 直接操作 View斟或。以達(dá)到
解耦的效果。

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

1.模型與視圖完全分離翰灾,我們可以修改視圖而不影響模型缕粹;
2.項(xiàng)目代碼結(jié)構(gòu)(文件夾)清晰稚茅,一看就知道什么類干什么事情;
3.我們可以將一個(gè)Presenter用于多個(gè)視圖平斩,而不需要改變Presenter的邏輯亚享,這個(gè)特性非常的有用,因?yàn)橐晥D的變化總是比模型的變化頻繁
4.協(xié)同工作(例如在設(shè)計(jì)師沒(méi)出圖之前可以先寫(xiě)一些業(yè)務(wù)邏輯代碼或者其他人接手代碼改起來(lái)比較容易);
5.代碼靈活性

MVP的缺點(diǎn):

Presenter層與View層是通過(guò)接口進(jìn)行交互的绘面,View層可能會(huì)有大量的接口欺税,因?yàn)橛锌赡芎脦讉€(gè)Activity都是去實(shí)現(xiàn)同一個(gè)View接口,那么所有用到的Activity都要去實(shí)現(xiàn)所有的方法(不管你是否用到)揭璃,而且如果后面有些方法要?jiǎng)h改晚凿,Presenter和Activity都要改動(dòng),比較麻煩瘦馍;

MVP 使用特點(diǎn)是面向接口編程(View/Presenter/Model 都定義一套接口)歼秽。

MVVM

MVP中我們說(shuō)過(guò)隨著業(yè)務(wù)邏輯的增加,UI的改變多的情況下情组,會(huì)有非常多的跟UI相關(guān)的 Case燥筷,這樣就會(huì)造成View的接口會(huì)很龐大。

而MVVM就解決了這個(gè)問(wèn)題院崇,通過(guò)雙向綁定的機(jī)制肆氓,實(shí)現(xiàn)數(shù)據(jù)和UI內(nèi)容,只要想改其中一方底瓣,另一方都能夠及時(shí)更新的一種設(shè)計(jì)理念谢揪,這樣就省去了很多在View層中寫(xiě)很多 Case 的情況,只需要改變數(shù)據(jù)就行捐凭。

Model:

Model層就是職責(zé)數(shù)據(jù)的存儲(chǔ)拨扶、讀取網(wǎng)絡(luò)數(shù)據(jù)、操作數(shù)據(jù)庫(kù)數(shù)據(jù)以及I/O柑营,一般會(huì)有一個(gè)ViewModel對(duì)象來(lái)調(diào)用獲取這一部分的數(shù)據(jù)屈雄。

View:

我感覺(jué)這里的View才是真正的View,為什么這么說(shuō)官套?View層做的僅僅和UI相關(guān)的工作酒奶,我們只在XML、Activity奶赔、Fragment寫(xiě)View層的代碼惋嚎。

View層不做任何業(yè)務(wù)邏輯、不涉及操作數(shù)據(jù)站刑、不處理數(shù)據(jù)另伍、UI和數(shù)據(jù)嚴(yán)格的分開(kāi)。

ViewModel:

ViewModel 只做和業(yè)務(wù)邏輯和業(yè)務(wù)數(shù)據(jù)相關(guān)的事,不做任何和UI摆尝、控件相關(guān)的事温艇,ViewModel 層不會(huì)持有任何控件的引用,更不會(huì)在ViewModel中通過(guò)UI控件的引用去做更新UI的事情堕汞。

ViewModel就是專注于業(yè)務(wù)的邏輯處理勺爱,操作的也都是對(duì)數(shù)據(jù)進(jìn)行操作,這些個(gè)數(shù)據(jù)源綁定在相應(yīng)的控件上會(huì)自動(dòng)去更改UI讯检,開(kāi)發(fā)者不需要關(guān)心更新UI的事情琐鲁。

image
MVVM 的缺點(diǎn):

數(shù)據(jù)綁定使得 Bug 很難被調(diào)試。

你看到界面異常了人灼,有可能是你 View 的代碼有 Bug围段,也可能是 Model 的代碼有問(wèn)題。
數(shù)據(jù)綁定使得一個(gè)位置的 Bug 被快速傳遞到別的位置投放,要定位原始出問(wèn)題的地方就變得不那么容易了奈泪。

不管是用哪種設(shè)計(jì)模式,只要運(yùn)用得當(dāng)灸芳,都可以達(dá)到想要的結(jié)果段磨。如果非要說(shuō)怎么選的話,建議如下:
1.如果項(xiàng)目簡(jiǎn)單耗绿,沒(méi)什么復(fù)雜性,未來(lái)改動(dòng)也不大的話砾隅,選擇常用的 MVC 就可以了误阻,注意將每個(gè)模塊封裝好,方便調(diào)用即可晴埂。
2.對(duì)于偏向展示型的 APP究反,絕大多數(shù)業(yè)務(wù)邏輯都在后端,APP 主要功能就是展示數(shù)據(jù)儒洛,交互等精耐,建議使用 MVVM。
3.對(duì)于工具類或者需要寫(xiě)很多業(yè)務(wù)邏輯 APP琅锻,使用MVP或者M(jìn)VVM都可卦停。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市恼蓬,隨后出現(xiàn)的幾起案子惊完,更是在濱河造成了極大的恐慌,老刑警劉巖处硬,帶你破解...
    沈念sama閱讀 216,324評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件小槐,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡荷辕,警方通過(guò)查閱死者的電腦和手機(jī)凿跳,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,356評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門件豌,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人控嗜,你說(shuō)我怎么就攤上這事茧彤。” “怎么了躬审?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,328評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵棘街,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我承边,道長(zhǎng)遭殉,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,147評(píng)論 1 292
  • 正文 為了忘掉前任博助,我火速辦了婚禮险污,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘富岳。我一直安慰自己蛔糯,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,160評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布窖式。 她就那樣靜靜地躺著蚁飒,像睡著了一般。 火紅的嫁衣襯著肌膚如雪萝喘。 梳的紋絲不亂的頭發(fā)上淮逻,一...
    開(kāi)封第一講書(shū)人閱讀 51,115評(píng)論 1 296
  • 那天,我揣著相機(jī)與錄音阁簸,去河邊找鬼爬早。 笑死,一個(gè)胖子當(dāng)著我的面吹牛启妹,可吹牛的內(nèi)容都是我干的筛严。 我是一名探鬼主播,決...
    沈念sama閱讀 40,025評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼饶米,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼桨啃!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起檬输,我...
    開(kāi)封第一講書(shū)人閱讀 38,867評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤优幸,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后褪猛,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體网杆,經(jīng)...
    沈念sama閱讀 45,307評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,528評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了碳却。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片队秩。...
    茶點(diǎn)故事閱讀 39,688評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖昼浦,靈堂內(nèi)的尸體忽然破棺而出馍资,到底是詐尸還是另有隱情,我是刑警寧澤关噪,帶...
    沈念sama閱讀 35,409評(píng)論 5 343
  • 正文 年R本政府宣布鸟蟹,位于F島的核電站,受9級(jí)特大地震影響使兔,放射性物質(zhì)發(fā)生泄漏建钥。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,001評(píng)論 3 325
  • 文/蒙蒙 一虐沥、第九天 我趴在偏房一處隱蔽的房頂上張望熊经。 院中可真熱鬧,春花似錦欲险、人聲如沸镐依。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,657評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)槐壳。三九已至,卻和暖如春喜每,著一層夾襖步出監(jiān)牢的瞬間宏粤,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,811評(píng)論 1 268
  • 我被黑心中介騙來(lái)泰國(guó)打工灼卢, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人来农。 一個(gè)月前我還...
    沈念sama閱讀 47,685評(píng)論 2 368
  • 正文 我出身青樓鞋真,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親沃于。 傳聞我的和親對(duì)象是個(gè)殘疾皇子涩咖,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,573評(píng)論 2 353

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