梗概
MVP模式是MVC模式在Android上的一種變體滔悉,在MVC模式中伊诵,Activity應(yīng)該是屬于View這一層,它既承擔(dān)了View回官,同時(shí)也包含了一些Controller的東西在里面曹宴,這對(duì)于開(kāi)發(fā)與維護(hù)來(lái)說(shuō)不太友好,耦合度太高歉提。把Activity的View和Controller抽離出來(lái)就變成了View和Presenter浙炼,這就是MVP模式。
先熟悉一下MVC模式
M層:適合做一些業(yè)務(wù)邏輯處理唯袄,比如數(shù)據(jù)庫(kù)存取操作弯屈,網(wǎng)絡(luò)操作,復(fù)雜的算法恋拷,耗時(shí)的任務(wù)等都在model層處理资厉。
V層:應(yīng)用層中處理數(shù)據(jù)顯示的部分,XML布局可以視為V層蔬顾,顯示Model層的數(shù)據(jù)結(jié)果宴偿。
C層:在Android中,Activity處理用戶交互問(wèn)題诀豁,因此可以認(rèn)為Activity是控制器窄刘,Activity讀取V視圖層的數(shù)據(jù)(eg.讀取當(dāng)前EditText控件的數(shù)據(jù)),控制用戶輸入(eg.EditText控件數(shù)據(jù)的輸入)舷胜,并向Model發(fā)送數(shù)據(jù)請(qǐng)求(eg.發(fā)起網(wǎng)絡(luò)請(qǐng)求等)娩践。
舉個(gè)例子大家可能比較好理解:實(shí)現(xiàn)的是一個(gè)天氣查詢功能,在頁(yè)面EditText上輸入城市名稱烹骨,點(diǎn)擊Button調(diào)用天氣API翻伺,返回的天氣數(shù)據(jù)顯示在TextView里面。例子中顯示的EditText沮焕、Button吨岭、TextView都屬于View層,例子中實(shí)現(xiàn)向API請(qǐng)求數(shù)據(jù)的是Model層峦树,Controller層就是其中的Activity辣辫,監(jiān)聽(tīng)View中的點(diǎn)擊事件旦事,然后向Model層(可能是數(shù)據(jù)庫(kù)、網(wǎng)絡(luò)急灭、算法姐浮、任務(wù)等)請(qǐng)求數(shù)據(jù),回調(diào)之后再在View中顯示化戳。
為什么用MVP架構(gòu)
我們平常開(kāi)發(fā)中的Activity单料、XML界面加起來(lái)就已經(jīng)相當(dāng)于一個(gè)MVC的架構(gòu)模式埋凯,這種開(kāi)發(fā)方式的缺點(diǎn)就是業(yè)務(wù)量大的時(shí)候点楼,一個(gè)Acitvity分分鐘飆到上千行代碼,想要改一處業(yè)務(wù)邏輯光是去找就要費(fèi)半天勁白对,而且有點(diǎn)地方邏輯處理是一樣的無(wú)奈是不同的 Activity 就沒(méi)辦法很好的寫成通用方法掠廓。
MVP 模式將Activity 中的業(yè)務(wù)邏輯全部分離出來(lái),讓Activity 只做 UI 邏輯的處理甩恼,所有跟Android API無(wú)關(guān)的業(yè)務(wù)邏輯由 Presenter 層來(lái)完成蟀瞧。將業(yè)務(wù)處理分離出來(lái)后最明顯的好處就是管理方便,但是缺點(diǎn)就是增加了代碼量条摸。Persenter的中文翻譯是“主持人”悦污。