MVP 模式及官方示例分析

MVP 簡(jiǎn)介

MVP 即 Model-View-Presenter秦士,是一種從 MVC 模型演化而來的用于 Android 開發(fā)的軟件開發(fā)模式瓦呼,目標(biāo)在于將應(yīng)用程序中的用戶交互划咐、界面顯示部分與后臺(tái)業(yè)務(wù)邏輯處理部分相分離,提升應(yīng)用程序的穩(wěn)定性和代碼的可維護(hù)箱熬、可測(cè)試性类垦。

Model:模型層,即數(shù)據(jù)層城须,數(shù)據(jù)的存儲(chǔ)蚤认、查詢、獲取糕伐、狀態(tài)轉(zhuǎn)變等操作均交由該層完成砰琢;
View:視圖層,界面顯示良瞧、用戶交互等功能由該層實(shí)現(xiàn)陪汽,在 Android 程序中,可能為一個(gè) Activity褥蚯、一個(gè) Fragment 或一個(gè) View 等挚冤;
Presenter:該層主要提供兩類功能:1)作為 Model 和 View 的媒介,負(fù)責(zé)在兩者間傳遞數(shù)據(jù)赞庶,如從 Model 層獲取數(shù)據(jù)交給 View 進(jìn)行展示训挡,從 View 層得到用戶輸入信息,交由 Model 加以保存等歧强;2)處理后臺(tái)任務(wù)澜薄,控制業(yè)務(wù)流程等。

MVP 結(jié)構(gòu)圖

上圖為 MVP 模式的基本交互結(jié)構(gòu)圖摊册,從圖中可知:
1) MVP 結(jié)構(gòu)中 View 和 Model 并不直接進(jìn)行交互肤京,而是通過中間媒介 Presenter 間接進(jìn)行交互;
2) 一般來說茅特,View 和 Presenter 之間是相互持有的關(guān)系蟆沫,即 View 中持有與其關(guān)聯(lián)的 Presenter,Presenter 也持有與自己進(jìn)行交互的 View温治,即它們通過這種一一對(duì)應(yīng)的關(guān)系進(jìn)行信息交換饭庞;而 Presenter 和 Model 間屬于單向持有關(guān)系,Presenter 中持有 Model熬荆,但 Model 中一般并不持有 Presenter舟山,這是因?yàn)橥ǔ?Model 層與整個(gè)應(yīng)用程序相關(guān),而非與某個(gè)頁面相關(guān)卤恳,如若讓 Model 層通過持有 Presenter 的引用來進(jìn)行信息交換的話累盗,會(huì)導(dǎo)致每次對(duì) Presenter 的增刪操作都需要修改 Model 層的代碼,不利于程序的擴(kuò)展突琳,而通過接口回調(diào)的方式來進(jìn)行信息交換就可以避免這類情況發(fā)生若债,從而提升程序的可擴(kuò)展性。

MVP 模式使用注意:

  1. Presenter與View拆融、Model的交互使用接口定義交互操作可以進(jìn)一步松耦合也可以通過接口更加方便地進(jìn)行單元測(cè)試蠢琳;
  2. MVP 模式的提出主要用于隔離界面顯示與業(yè)務(wù)邏輯處理啊终,所以在編碼時(shí)需要注意區(qū)分這兩者的界限,如對(duì)于一個(gè) EditText傲须,當(dāng)只需要對(duì)輸入內(nèi)容進(jìn)行簡(jiǎn)單的判空操作時(shí)蓝牲,可以直接在 View 層完成,但如若需要進(jìn)行更復(fù)雜的判斷泰讽,如判斷輸入內(nèi)容是否與已有內(nèi)容沖突時(shí)例衍,則需要交由業(yè)務(wù)邏輯層進(jìn)行處理。

Todo 項(xiàng)目

項(xiàng)目組織結(jié)構(gòu)

項(xiàng)目地址:https://github.com/googlesamples/android-architecture

該項(xiàng)目官方明明為 Android 架構(gòu)藍(lán)圖已卸,旨在采用不同的架構(gòu)設(shè)計(jì)模式實(shí)現(xiàn)同一個(gè) APP 功能來輔助開發(fā)者進(jìn)行架構(gòu)選擇佛玄。該項(xiàng)目中包含了13 個(gè)已實(shí)現(xiàn)或正在實(shí)現(xiàn)中的小 Demo,本文主要基于 Todo-MVP 這個(gè) MVP 基礎(chǔ)實(shí)例架構(gòu)進(jìn)行分析累澡。

項(xiàng)目架構(gòu)目錄

上圖展示了 Todo-MVP 項(xiàng)目的組織結(jié)構(gòu)翎嫡。項(xiàng)目包含五部分:APP 功能實(shí)現(xiàn)部分和四個(gè)用于測(cè)試的目錄,這四個(gè)測(cè)試目錄分為兩部分永乌,分別用于 UI 層的測(cè)試和業(yè)務(wù)邏輯層的測(cè)試惑申。APP 功能實(shí)現(xiàn)部分根據(jù)業(yè)務(wù)功能進(jìn)行模塊劃分,主要有四個(gè)功能模塊:addedittask(增加 / 修改任務(wù))翅雏、statistics(數(shù)據(jù)統(tǒng)計(jì))圈驼、taskdetail(任務(wù)詳情)和 tasks(任務(wù)主頁面),data 模塊即項(xiàng)目的 Model 層望几,用于從本地?cái)?shù)據(jù)庫 / 遠(yuǎn)程網(wǎng)絡(luò)中獲取數(shù)據(jù)绩脆。 每一個(gè)功能模塊內(nèi)部均由四個(gè)部分構(gòu)成:XXActivity、XXFragment橄抹、XXContract 和 XXPresenter靴迫,即統(tǒng)籌控制的 Activity,用戶交互的 View楼誓,View 和 Presenter 需實(shí)現(xiàn)的接口定義和用于處理業(yè)務(wù)邏輯的 Presenter玉锌。可以看到官方示例項(xiàng)目的組織結(jié)構(gòu)簡(jiǎn)潔明了疟羹,通過類名便可大致了解該類的主要功能主守,是學(xué)習(xí)的典范。

項(xiàng)目中的 MVP

下圖以 AddEditTask 作為示例榄融,簡(jiǎn)單描述了項(xiàng)目中的 MVP 結(jié)構(gòu)参淫。項(xiàng)目中使用了接口來松耦合,通過 XXFragment愧杯、XXPresenter 分別作為 View 和 Presenter涎才,data 包作為 Model 來實(shí)現(xiàn) MVP 模式。

MVP 輪廓示意

下面腦圖對(duì)整個(gè)項(xiàng)目結(jié)構(gòu)進(jìn)行了描述力九。


Google Todo 項(xiàng)目腦圖

** 要點(diǎn)分析:**

  1. 項(xiàng)目中 Activity 的作用在于作為一個(gè)全局控制者耍铜,創(chuàng)建當(dāng)前頁面的 Fragment 和 Presenter邑闺,并將兩者聯(lián)系起來,具體而言:Fragment 作為參數(shù)傳遞給 Presenter 的構(gòu)造函數(shù)业扒,然后 Presenter 在構(gòu)造函數(shù)中通過調(diào)用 Fragment 的 setPresenter() 方法將自身傳遞給 Fragment检吆,這樣便建立了兩者的聯(lián)系舒萎;
  2. 項(xiàng)目中使用了 BaseView 和 BasePresenter 分別作為 View 和 Presenter 的基類程储,復(fù)用所有 View 和 Presenter 中均需使用的方法;
  3. 契約類:XXContract 即為項(xiàng)目中的契約類臂寝,該項(xiàng)目將 View 和 Presenter 的接口統(tǒng)一由一個(gè)契約類來進(jìn)行管理章鲤,不僅可以減少類數(shù)目,而且能夠通過該類一目了然地獲知當(dāng)前頁面中 View 和 Presenter 均有哪些主要功能咆贬,便于管理和維護(hù)败徊;
  4. 項(xiàng)目的模型層統(tǒng)一包含在 data 目錄中,內(nèi)部根據(jù)本地和遠(yuǎn)程進(jìn)行功能劃分掏缎,分別實(shí)現(xiàn)本地?cái)?shù)據(jù)存儲(chǔ)皱蹦、獲取和遠(yuǎn)程數(shù)據(jù)傳輸,清晰明了眷蜈;

** 總結(jié):**

  1. 復(fù)雜度:本項(xiàng)目只實(shí)現(xiàn)了幾個(gè)基本功能沪哺,整體代碼量較小,復(fù)雜度較低酌儒;
  2. 可測(cè)試性:MVP 架構(gòu)很好地將 UI 層和業(yè)務(wù)邏輯層隔離辜妓,所以整體可測(cè)試性相當(dāng)好,可以對(duì) UI 層和業(yè)務(wù)邏輯層分別進(jìn)行測(cè)試忌怎;
    3.可維護(hù)性可擴(kuò)展性:MVP 架構(gòu)的引入籍滴,雖然代碼量有了一定的上升,但是由于界限非常清晰榴啸,各個(gè)類職責(zé)都非常明確且單一孽惰,所以后期的擴(kuò)展,維護(hù)都會(huì)更加容易鸥印。

** 參考:**

  1. Android官方MVP架構(gòu)示例項(xiàng)目解析
  2. Introduction to Model-View-Presenter on Android
  3. Google官方架構(gòu)MVP解析與實(shí)戰(zhàn)
  4. Android 中的 MVP
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末灰瞻,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子辅甥,更是在濱河造成了極大的恐慌酝润,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,366評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件璃弄,死亡現(xiàn)場(chǎng)離奇詭異要销,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)夏块,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,521評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門疏咐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來纤掸,“玉大人,你說我怎么就攤上這事浑塞〗韫颍” “怎么了?”我有些...
    開封第一講書人閱讀 165,689評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵酌壕,是天一觀的道長(zhǎng)掏愁。 經(jīng)常有香客問我,道長(zhǎng)卵牍,這世上最難降的妖魔是什么果港? 我笑而不...
    開封第一講書人閱讀 58,925評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮糊昙,結(jié)果婚禮上辛掠,老公的妹妹穿的比我還像新娘。我一直安慰自己释牺,他們只是感情好萝衩,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,942評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著没咙,像睡著了一般猩谊。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上镜撩,一...
    開封第一講書人閱讀 51,727評(píng)論 1 305
  • 那天预柒,我揣著相機(jī)與錄音,去河邊找鬼袁梗。 笑死宜鸯,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的遮怜。 我是一名探鬼主播淋袖,決...
    沈念sama閱讀 40,447評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼锯梁!你這毒婦竟也來了即碗?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,349評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤陌凳,失蹤者是張志新(化名)和其女友劉穎剥懒,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體合敦,經(jīng)...
    沈念sama閱讀 45,820評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡初橘,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,990評(píng)論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片保檐。...
    茶點(diǎn)故事閱讀 40,127評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡耕蝉,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出夜只,到底是詐尸還是另有隱情垒在,我是刑警寧澤,帶...
    沈念sama閱讀 35,812評(píng)論 5 346
  • 正文 年R本政府宣布扔亥,位于F島的核電站场躯,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏砸王。R本人自食惡果不足惜推盛,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,471評(píng)論 3 331
  • 文/蒙蒙 一峦阁、第九天 我趴在偏房一處隱蔽的房頂上張望谦铃。 院中可真熱鬧,春花似錦榔昔、人聲如沸驹闰。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,017評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽嘹朗。三九已至,卻和暖如春诵肛,著一層夾襖步出監(jiān)牢的瞬間屹培,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,142評(píng)論 1 272
  • 我被黑心中介騙來泰國打工怔檩, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留褪秀,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,388評(píng)論 3 373
  • 正文 我出身青樓薛训,卻偏偏與公主長(zhǎng)得像媒吗,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子乙埃,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,066評(píng)論 2 355

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

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,183評(píng)論 25 707
  • 前言 看了下上篇博客的發(fā)表時(shí)間到這篇博客辙喂,竟然過了11個(gè)月,罪過,罪過加派。這一年時(shí)間也是夠折騰的叫确,年初離職跳槽到鵝廠...
    西木柚子閱讀 21,244評(píng)論 12 184
  • 轉(zhuǎn)載至:http://www.reibang.com/p/9a6845b26856 “Android MVP 詳解...
    SnowDragonYY閱讀 10,322評(píng)論 5 241
  • 02:15 睡不著竹勉,也不想再看書 腦子不夠用,效率不高娄琉,好像之前自己還在感嘆天呀還剩九十天怎么辦次乓,現(xiàn)在就只剩一個(gè)月...
    西瓜米閱讀 194評(píng)論 0 0
  • 沒有星星夜空不可能有如此 浩瀚的美麗就像 藍(lán)天失去白云不可能有如此純度高的比例故事 倘若沒有跌宕的情節(jié)也不可能 跟...
    水念閱讀 276評(píng)論 1 3