什么是MVP模式?
MVP毒返?啥租幕,這還用介紹,相信看球的朋友對(duì)這個(gè)應(yīng)該毫不陌生吧拧簸。不就是 Most Valuable Player劲绪,最有價(jià)值球員嘛。所以當(dāng)初看到這個(gè)詞時(shí)也是一種莫名的親切感。不過此MVP可非彼MVP贾富,我們今天要討論的MVP其實(shí)同MVC一樣歉眷,是一種編程模式和思想,也許更準(zhǔn)確地講是一種架構(gòu)颤枪。
既然原來大家MVC用的好好的汗捡,為啥突然要冒出一個(gè)MVP呢?說明MVC自然有自己的缺陷汇鞭。因?yàn)锳ndroid的特殊性凉唐,使得Activity對(duì)應(yīng)了MVC中的V和C,同時(shí)擔(dān)任兩個(gè)角色,就有了類似“既當(dāng)?shù)之?dāng)媽”的感覺霍骄,這顯然就不符合軟件設(shè)計(jì)原則的“單一職責(zé)”原則台囱。但現(xiàn)實(shí)中是很多的APP代碼中有這么的處境,特別是Androi原生的很多系統(tǒng)APK读整,某些Activity動(dòng)則幾千行代碼簿训。 況且,隨著項(xiàng)目的深入發(fā)展米间,很多邏輯很越來越復(fù)雜强品,Activity處理的東西也會(huì)越來越多,代碼越來越臃腫屈糊。這樣一來維護(hù)起來的代價(jià)就會(huì)越來越高的榛。為了解耦,所以MVP模式應(yīng)用而生逻锐。
MVP如何解耦夫晌?
MVP的架構(gòu)圖如下
關(guān)于三者的關(guān)系,用一個(gè)簡(jiǎn)單的例子進(jìn)行理解昧诱,就是開發(fā)商晓淀,明星和經(jīng)紀(jì)人。開發(fā)商想找明星進(jìn)行代言某個(gè)品牌盏档,但是明星每天應(yīng)酬很忙啊不可能所有事都自己處理的凶掰,所以開發(fā)商需要找到明星的經(jīng)紀(jì)人進(jìn)行溝通,由經(jīng)紀(jì)人再來傳達(dá)意思給明星蜈亩。這里開發(fā)商和明星之間是沒有聯(lián)系的懦窘,而是通過人中間的經(jīng)紀(jì)人進(jìn)行溝通。Presenter就是這個(gè)經(jīng)紀(jì)人的角色勺拣。
好吧奶赠,扯了一大堆有的沒的,具體代碼中如何去實(shí)現(xiàn)呢药有。這里我通過一個(gè)簡(jiǎn)單輸入賬號(hào)及密碼的登錄過程去詳細(xì)介紹毅戈。
UI方面很簡(jiǎn)單苹丸,一個(gè)用戶名輸入框,一個(gè)密碼輸入框苇经,點(diǎn)擊登錄后赘理,彈出progressbar.
M層:
首先是M層的代碼編寫,M層主要是一些業(yè)務(wù)邏輯扇单,這里只有登錄商模。所以新建一個(gè)接口只需要定義一個(gè)登錄的方法。參數(shù)方面蜘澜,傳入用戶名施流,密碼以及登錄結(jié)果的回調(diào)。
然后是登錄結(jié)果的接口鄙信,只有成功和失敗兩種結(jié)果瞪醋。
接著新建一個(gè)Login類去具體實(shí)現(xiàn)ILogin接口,點(diǎn)擊登錄后装诡,progressbar開始轉(zhuǎn)圈银受,默認(rèn)用戶名admin,密碼123,如果正確回調(diào)登錄成功方法鸦采,并傳入用戶信息宾巍。錯(cuò)誤回調(diào)登錄失敗方法。
至此M層代碼便已經(jīng)OK渔伯,是不是覺得很簡(jiǎn)單呢顶霞。
V層:
哪些需要放在V層代碼中呢,比如獲取設(shè)置用戶名锣吼,密碼确丢,顯示隱藏progressbar,設(shè)置登錄按鈕是否可點(diǎn)擊狀態(tài),登錄成功后跳轉(zhuǎn)界面吐限,登陸失敗的吐司提示等直觀上的界面操作就應(yīng)該放在這里。直接上代碼褂始,還是先定義VIEW層接口
然后我們具體的activity去實(shí)現(xiàn)這個(gè)接口诸典,具體實(shí)現(xiàn)方法就可以了。
P層:
好吧崎苗,最關(guān)鍵的到了狐粱。P層該如何把M層和V層關(guān)聯(lián)起來呢。既然P層是中間人胆数,首先肯定應(yīng)該持有M層和V層的對(duì)象肌蜻。P層到時(shí)肯定實(shí)在V層被創(chuàng)建,所以可以通過構(gòu)造函數(shù)進(jìn)行獲取V層必尼,既然是解耦蒋搜,所以M層不能通過構(gòu)造函數(shù)獲取篡撵。直接一個(gè)登錄的方法,顯示progressbar豆挽,如果登錄按鈕的狀態(tài)可用就調(diào)用M層中的登錄育谬。這里應(yīng)該很直觀了,調(diào)用M層的登錄方法帮哈,里面的賬號(hào)和密碼調(diào)用V層的方法獲取膛檀,這樣就把M層和V層聯(lián)系到了一起。
最后在activity中創(chuàng)建presenter對(duì)象娘侍,然后在點(diǎn)擊登錄按鈕的時(shí)候調(diào)用presenter的登錄方法就可以了
大功告成看看效果: