android中深入淺出了解MVP模式

什么是MVP模式?

MVP?啥,這還用介紹,相信看球的朋友對這個應(yīng)該毫不陌生吧。不就是 Most Valuable Player,最有價值球員嘛。所以當(dāng)初看到這個詞時也是一種莫名的親切感。不過此MVP可非彼MVP,我們今天要討論的MVP其實同MVC一樣,是一種編程模式和思想,也許更準(zhǔn)確地講是一種架構(gòu)。

既然原來大家MVC用的好好的,為啥突然要冒出一個MVP呢?說明MVC自然有自己的缺陷。因為Android的特殊性,使得Activity對應(yīng)了MVC中的V和C,同時擔(dān)任兩個角色,就有了類似“既當(dāng)?shù)之?dāng)媽”的感覺,這顯然就不符合軟件設(shè)計原則的“單一職責(zé)”原則。但現(xiàn)實中是很多的APP代碼中有這么的處境,特別是Androi原生的很多系統(tǒng)APK,某些Activity動則幾千行代碼。 況且,隨著項目的深入發(fā)展,很多邏輯很越來越復(fù)雜,Activity處理的東西也會越來越多,代碼越來越臃腫。這樣一來維護(hù)起來的代價就會越來越高。為了解耦,所以MVP模式應(yīng)用而生。

MVP如何解耦?

MVP的架構(gòu)圖如下
image.png
關(guān)于三者的關(guān)系,用一個簡單的例子進(jìn)行理解,就是開發(fā)商,明星和經(jīng)紀(jì)人。開發(fā)商想找明星進(jìn)行代言某個品牌,但是明星每天應(yīng)酬很忙啊不可能所有事都自己處理的,所以開發(fā)商需要找到明星的經(jīng)紀(jì)人進(jìn)行溝通,由經(jīng)紀(jì)人再來傳達(dá)意思給明星。這里開發(fā)商和明星之間是沒有聯(lián)系的,而是通過人中間的經(jīng)紀(jì)人進(jìn)行溝通。Presenter就是這個經(jīng)紀(jì)人的角色。

好吧,扯了一大堆有的沒的,具體代碼中如何去實現(xiàn)呢。這里我通過一個簡單輸入賬號及密碼的登錄過程去詳細(xì)介紹。

UI方面很簡單,一個用戶名輸入框,一個密碼輸入框,點擊登錄后,彈出progressbar.
image.png

M層:

首先是M層的代碼編寫,M層主要是一些業(yè)務(wù)邏輯,這里只有登錄。所以新建一個接口只需要定義一個登錄的方法。參數(shù)方面,傳入用戶名,密碼以及登錄結(jié)果的回調(diào)。
image.png

然后是登錄結(jié)果的接口,只有成功和失敗兩種結(jié)果。


image.png

接著新建一個Login類去具體實現(xiàn)ILogin接口,點擊登錄后,progressbar開始轉(zhuǎn)圈,默認(rèn)用戶名admin,密碼123,如果正確回調(diào)登錄成功方法,并傳入用戶信息。錯誤回調(diào)登錄失敗方法。


image.png

至此M層代碼便已經(jīng)OK,是不是覺得很簡單呢。

V層:

哪些需要放在V層代碼中呢,比如獲取設(shè)置用戶名,密碼,顯示隱藏progressbar,設(shè)置登錄按鈕是否可點擊狀態(tài),登錄成功后跳轉(zhuǎn)界面,登陸失敗的吐司提示等直觀上的界面操作就應(yīng)該放在這里。直接上代碼,還是先定義VIEW層接口


image.png

然后我們具體的activity去實現(xiàn)這個接口,具體實現(xiàn)方法就可以了。

image.png
image.png

P層:

好吧,最關(guān)鍵的到了。P層該如何把M層和V層關(guān)聯(lián)起來呢。既然P層是中間人,首先肯定應(yīng)該持有M層和V層的對象。P層到時肯定實在V層被創(chuàng)建,所以可以通過構(gòu)造函數(shù)進(jìn)行獲取V層,既然是解耦,所以M層不能通過構(gòu)造函數(shù)獲取。直接一個登錄的方法,顯示progressbar,如果登錄按鈕的狀態(tài)可用就調(diào)用M層中的登錄。這里應(yīng)該很直觀了,調(diào)用M層的登錄方法,里面的賬號和密碼調(diào)用V層的方法獲取,這樣就把M層和V層聯(lián)系到了一起。

image.png

最后在activity中創(chuàng)建presenter對象,然后在點擊登錄按鈕的時候調(diào)用presenter的登錄方法就可以了


image.png

大功告成看看效果:

image.png
image.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容