Android架構(gòu)設(shè)計(jì)之MVP(一)

????MVP+Retrofit+RxJava的架構(gòu)是當(dāng)前比較流行的框架各薇,GitHub上面有很多MVP+Retrofit+RxJava架構(gòu)的APP都有不少的Star遇汞。 今天就從MVP講起撒遣,我在自己的項(xiàng)目里也使用了這個(gè)設(shè)計(jì)模式载城。

????MVP模式是MVC模式在Android上的一種變體最铁,要介紹MVP就得先介紹MVC讯赏。在MVC模式中,Activity應(yīng)該是屬于View這一層冷尉。而實(shí)質(zhì)上漱挎,它既承擔(dān)了View,同時(shí)也包含一些Controller的東西在里面雀哨。這對(duì)于開(kāi)發(fā)與維護(hù)來(lái)說(shuō)不太友好磕谅,耦合度大高了。把Activity的View和Controller抽離出來(lái)就變成了View和Presenter就是MVP模式雾棺。所以膊夹,為什么使用MVP,一句話就是:解耦捌浩。

什么是MVP設(shè)計(jì)模式放刨,下面的內(nèi)容摘錄自?Essential Guide For Designing Your Android App Architecture: MVP: Part 1

MVP將應(yīng)用分成三種基本的組件:

1.Model:它的職責(zé)是處理應(yīng)用數(shù)據(jù)的部分

2.View:它的職責(zé)是在屏幕上布局顯示指定數(shù)據(jù)的視圖

3.Presenter:它是一個(gè)連接Model和View的橋梁。也是扮演指揮view的角色尸饺。

根據(jù)以上提到的組件进统,MVP可以列出以下一些基本的規(guī)則:

1.Presenter控制View來(lái)畫UI助币,View是應(yīng)用中被控制的部分。

2.View將委托用戶所有的交互行為給Presenter處理

3.View從不直接從Model獲取數(shù)據(jù)

4.Presenter是負(fù)責(zé)委派View的請(qǐng)求給Model和根據(jù)特定的事件要求View做出相應(yīng)的動(dòng)作

5.Model的職責(zé)是從服務(wù)器螟碎、數(shù)據(jù)庫(kù)眉菱、文件中抓取數(shù)據(jù)

根據(jù)MVP模式,我先寫下序文:

1.Acitivity、Fragment和自定義View在應(yīng)用中扮演View的部分.

2.每一個(gè)View都有一個(gè)它對(duì)應(yīng)的Presenter.

3.View通過(guò)一個(gè)接口(Interface)和它對(duì)應(yīng)Presenter連接抚芦。反之亦然.

4.Model被分成幾個(gè)部分:ApiHelper, PreferenceHelper, DatabaseHelper, 和FileHelper.這些所有的數(shù)據(jù)渠道會(huì)在數(shù)據(jù)管理(DataManager)中實(shí)現(xiàn)倍谜,也就是數(shù)據(jù)管理將所有的Model進(jìn)行統(tǒng)一管理.

5.Presenter通過(guò)接口調(diào)用DataManager的實(shí)現(xiàn).

6.DataManager(數(shù)據(jù)管理)只有被調(diào)用的時(shí)候才進(jìn)行服務(wù).

7.Presenter沒(méi)有使用任何的安卓API.

首先,讓我們描述這個(gè)架構(gòu)藍(lán)圖

不管你從事什么軟件工程叉抡,架構(gòu)都是一件首要考慮的事情。一個(gè)小心地精心設(shè)計(jì)的框架不但提供一個(gè)很好的擴(kuò)展性而且在將來(lái)還能減少大量的重復(fù)工作〈鸷粒現(xiàn)在很多項(xiàng)目都是一個(gè)團(tuán)隊(duì)來(lái)開(kāi)發(fā)褥民,因此,項(xiàng)目代碼的可讀性和模塊性在架構(gòu)設(shè)計(jì)中應(yīng)該被視為至關(guān)重要的要素洗搂。我們也有大量的依賴第三方一些庫(kù)和不斷得更換方案由于使用的場(chǎng)景消返、bugs和支持。所以我們的架構(gòu)應(yīng)該設(shè)計(jì)成即插即用的設(shè)計(jì)耘拇。接口(Interface)在類中的運(yùn)用就是這個(gè)目的撵颊。

上面畫出來(lái)的安卓架構(gòu)藍(lán)圖包含所有的特性和是基于MVP藍(lán)圖。

你看接下來(lái)的內(nèi)容可能會(huì)覺(jué)得不是那么清楚惫叛,但只要你看過(guò)這篇文章對(duì)應(yīng)下一部分給出的例子倡勇,這些概念你將會(huì)很清楚了

讓我們來(lái)理解概略架構(gòu)中每一部分

View:這是應(yīng)用的一部分,主要用來(lái)渲染UI和接受來(lái)至用戶的交互嘉涌。主要由Activity妻熊,F(xiàn)ragment和CustomView(自定義view)構(gòu)成

MvpView: 由View來(lái)實(shí)現(xiàn)的一個(gè)接口,這個(gè)接口包含的方法都是暴露給它對(duì)應(yīng)的Presenter使用的仑最。

Presenter:它的數(shù)量主要取決于View的數(shù)量并且它是一個(gè)不連接安卓API的純java類扔役。它從對(duì)應(yīng)的View中接收用戶的交互信息,然后做一些業(yè)務(wù)邏輯判斷警医,最后引導(dǎo)View運(yùn)行一些指定的行為亿胸。它也可以通過(guò)數(shù)據(jù)管理(DataManager)獲取業(yè)務(wù)邏輯需要的任何數(shù)據(jù)。

MvpPresenter:由Presenter來(lái)實(shí)現(xiàn)的一個(gè)接口预皇。它包含的方法主要是給它對(duì)應(yīng)的View調(diào)用的侈玄。

AppDbHelper:應(yīng)用中的一部分,主要是數(shù)據(jù)庫(kù)管理和所有處理與數(shù)據(jù)庫(kù)相關(guān)的數(shù)據(jù)深啤。

DbHelper:由AppDbHelper實(shí)現(xiàn)的一個(gè)接口和包含暴露給應(yīng)用組件調(diào)用的方法拗馒。這層可以解耦任何指定實(shí)現(xiàn)DbHelper,因此使得AppDbHelper成為即插即用的模塊溯街。

AppPreferenceHelper:這個(gè)就像AppDbHelper一樣诱桂,只不過(guò)它的主要任務(wù)是從安卓share preference讀寫數(shù)據(jù)洋丐。

PreferenceHelper:和DbHelper一樣的接口,只不過(guò)由AppPreferenceHelper來(lái)實(shí)現(xiàn)挥等。

AppApiHelper:主要管理網(wǎng)絡(luò)相關(guān)的API調(diào)用和數(shù)據(jù)處理友绝。

ApiHelper:和DbHelper 一樣的接口,只不過(guò)由AppApiHelper來(lái)實(shí)現(xiàn)肝劲。

DataManager:由AppDataManager來(lái)實(shí)現(xiàn)的一個(gè)接口迁客。它包含并暴露所有數(shù)據(jù)處理相關(guān)的操作方法。理想上辞槐,它所有實(shí)現(xiàn)委托給提供服務(wù)的所有Helper 類掷漱。對(duì)于這個(gè)DataManager接口,它繼承了DbHelper, PreferenceHelper 和ApiHelper 接口.

AppDataManager:在應(yīng)用中榄檬,它是一個(gè)聯(lián)系任何數(shù)據(jù)相關(guān)的操作卜范。DbHelper, PreferenceHelper 和 ApiHelper 只為DataManager效勞。它委托所有的實(shí)現(xiàn)給指定的任何的Helper鹿榜。

現(xiàn)在我們熟悉了所有的組件和它們?cè)谝粋€(gè)應(yīng)用中扮演的角色海雪。我們現(xiàn)在將在這些各種各樣組件中制定交流的模式。

應(yīng)用(Application )類實(shí)例化AppDbHelper (賦值給DbHelper 變量)舱殿,AppPreferenceHelper (賦值給PreferenceHelper 變量)奥裸,AppApiHelper (賦值給ApiHelper 變量)和最后將DbHelper、PreferenceHelper 和PreferenceHelper 引用傳給AppDataManager(賦值給DataManager 變量) 進(jìn)行實(shí)例化沪袭。

View 組件實(shí)例化它對(duì)應(yīng)的Presenter湾宙,并傳給MvpPresenter引用。

Presenter接收它的View組件和并通過(guò)MvpView引用它枝恋,Presenter也接收DataManager创倔。

DataManager 作為一個(gè)單例存在。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末焚碌,一起剝皮案震驚了整個(gè)濱河市畦攘,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌十电,老刑警劉巖知押,帶你破解...
    沈念sama閱讀 217,406評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異鹃骂,居然都是意外死亡台盯,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門畏线,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)静盅,“玉大人,你說(shuō)我怎么就攤上這事寝殴≥锏” “怎么了明垢?”我有些...
    開(kāi)封第一講書人閱讀 163,711評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)市咽。 經(jīng)常有香客問(wèn)我痊银,道長(zhǎng),這世上最難降的妖魔是什么施绎? 我笑而不...
    開(kāi)封第一講書人閱讀 58,380評(píng)論 1 293
  • 正文 為了忘掉前任溯革,我火速辦了婚禮,結(jié)果婚禮上谷醉,老公的妹妹穿的比我還像新娘致稀。我一直安慰自己,他們只是感情好俱尼,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,432評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布豺裆。 她就那樣靜靜地躺著,像睡著了一般号显。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上躺酒,一...
    開(kāi)封第一講書人閱讀 51,301評(píng)論 1 301
  • 那天押蚤,我揣著相機(jī)與錄音,去河邊找鬼羹应。 笑死揽碘,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的园匹。 我是一名探鬼主播雳刺,決...
    沈念sama閱讀 40,145評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼裸违!你這毒婦竟也來(lái)了掖桦?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 39,008評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤供汛,失蹤者是張志新(化名)和其女友劉穎枪汪,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體怔昨,經(jīng)...
    沈念sama閱讀 45,443評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡雀久,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,649評(píng)論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了趁舀。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片赖捌。...
    茶點(diǎn)故事閱讀 39,795評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖矮烹,靈堂內(nèi)的尸體忽然破棺而出越庇,到底是詐尸還是另有隱情罩锐,我是刑警寧澤,帶...
    沈念sama閱讀 35,501評(píng)論 5 345
  • 正文 年R本政府宣布悦荒,位于F島的核電站唯欣,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏搬味。R本人自食惡果不足惜境氢,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,119評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望碰纬。 院中可真熱鬧萍聊,春花似錦、人聲如沸悦析。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,731評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)强戴。三九已至亭螟,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間骑歹,已是汗流浹背预烙。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 32,865評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留道媚,地道東北人扁掸。 一個(gè)月前我還...
    沈念sama閱讀 47,899評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像最域,于是被迫代替她去往敵國(guó)和親谴分。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,724評(píng)論 2 354

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