什么是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)圖如下

關(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.

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

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

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

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

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


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)系到了一起。


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

大功告成看看效果:

