????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è)單例存在。