MVP也即Model-View-Presenter尊浪,是在MVC基礎(chǔ)上優(yōu)化衍生出來(lái)的一種軟件架構(gòu)模式集惋,它將MVC中的Controller層進(jìn)行了優(yōu)化而生成了Presenter(可理解為主持者或表示者)俗壹。
這里Presenter層和MVC的Controller一樣私痹,負(fù)責(zé)核心邏輯捎迫,但不同的是踢星,Presenter通過(guò)接口協(xié)議進(jìn)行數(shù)據(jù)傳遞澳叉、功能調(diào)用,并阻斷了View和Model的直接聯(lián)系沐悦,從而使View和Model更加專(zhuān)注于自身業(yè)務(wù)邏輯成洗,更好地實(shí)現(xiàn)了高內(nèi)聚、低耦合藏否,同時(shí)也方便單元測(cè)試瓶殃。
用下圖來(lái)說(shuō)明二者之間的對(duì)比,可能更直觀些副签。
在Android平臺(tái)上遥椿,由于Activity/Fragment的生命周期比較復(fù)雜以及配置可能發(fā)生變化等因素,我們?cè)诰唧w實(shí)現(xiàn)時(shí)淆储,可以采用多種不同的方案冠场。
本文對(duì)Android平臺(tái)上常見(jiàn)的MVP架構(gòu)模式,從實(shí)現(xiàn)方案的角度嘗試做些分析本砰,也歡迎一起深入探討碴裙。
1、Google官方實(shí)現(xiàn)
這里使用的例子為T(mén)ODO-MVP点额,屬于MVP架構(gòu)的一個(gè)基礎(chǔ)實(shí)現(xiàn)青团,主要功能是記錄、查看待處理任務(wù)咖楣,管理待辦事宜。
其項(xiàng)目工程結(jié)構(gòu)和包芦昔,是按照功能來(lái)劃分的诱贿,包括新建/編輯、任務(wù)統(tǒng)計(jì)、詳情查看等模塊珠十,如圖料扰。
各個(gè)子模塊的實(shí)現(xiàn)比較類(lèi)似,以新建/編輯任務(wù)模塊為例焙蹭,其UML靜態(tài)結(jié)構(gòu)如下晒杈。
其中AddEditTaskActivity完成Presenter的實(shí)例化,并將實(shí)現(xiàn)了View接口的AddEditTaskFragment對(duì)象作為一個(gè)參數(shù)傳遞到構(gòu)造函數(shù)中孔厉,再通過(guò)setPresenter調(diào)用拯钻,把AddEditTaskPresenter傳遞給AddEditTaskFragment,建立View和Presenter之間的雙向關(guān)聯(lián)撰豺。而TasksDataSource接口及TasksRepository類(lèi)則對(duì)應(yīng)Model粪般,負(fù)責(zé)完成任務(wù)的獲取、保存和刷新等處理污桦。
這里獲取任務(wù)數(shù)據(jù)的回調(diào)處理亩歹,是通過(guò)Presenter實(shí)現(xiàn)TasksDataSource.GetTaskCallback接口來(lái)完成的,在onTaskLoaded 和onDataNotAvailable回調(diào)中根據(jù)數(shù)據(jù)獲取情況更新UI顯示凡橱。
除了上面提到的基礎(chǔ)調(diào)用邏輯之外小作,我們還需要關(guān)注該實(shí)現(xiàn)中,在Fragment不同的生命周期以及Activity配置發(fā)生變化時(shí)稼钩,對(duì)應(yīng)Presenter的處理方式顾稀。
生命周期的處理,又分為兩部分变抽。一是在onActivityCreated完成“新建”按鈕的屬性和點(diǎn)擊事件設(shè)置础拨,二是在onResume中調(diào)用Presenter的start方法,以獲取待編輯的任務(wù)數(shù)據(jù)绍载。
配置變化的處理诡宗,則是通過(guò)AddEditTaskPresenter構(gòu)造函數(shù)中的一個(gè)變量來(lái)實(shí)現(xiàn)的,該變量在任務(wù)數(shù)據(jù)獲取完成之后加以復(fù)位击儡。Activity中塔沃,對(duì)應(yīng)的變量在配置變化時(shí)會(huì)被保存下來(lái),當(dāng)再次創(chuàng)建Activity時(shí)阳谍,該變量被傳遞給AddEditTaskPresenter蛀柴,這樣避免了由于配置變化帶來(lái)的數(shù)據(jù)丟失。
實(shí)際上矫夯,針對(duì)配置變化的問(wèn)題鸽疾,Google官方的TODO-MVP-Loders實(shí)現(xiàn)給出了另外一種解決方案。該實(shí)現(xiàn)利用Loader機(jī)制來(lái)處理數(shù)據(jù)訪問(wèn)训貌,對(duì)于任務(wù)數(shù)據(jù)的訪問(wèn)管理提供了更強(qiáng)大的功能制肮,包括異步加載數(shù)據(jù)冒窍、監(jiān)聽(tīng)數(shù)據(jù)變化以及自動(dòng)重連等。
與之類(lèi)似的官方實(shí)現(xiàn)還有TODO-MVP-Clean豺鼻,該實(shí)現(xiàn)主要是增加了一個(gè)Domain層综液,可以理解為業(yè)務(wù)邏輯層,負(fù)責(zé)處理Presenter發(fā)起的業(yè)務(wù)邏輯相關(guān)的操作儒飒。個(gè)人認(rèn)為這種實(shí)現(xiàn)是對(duì)MVP中的Model做了擴(kuò)展谬莹,將業(yè)務(wù)邏輯與數(shù)據(jù)訪問(wèn)進(jìn)一步解耦。
關(guān)于Google官方MVP架構(gòu)實(shí)現(xiàn)桩了,暫且分析到這里附帽,歡迎繼續(xù)關(guān)注。