談MVP以前咱們先來聊一聊軟件開發中的模式,在軟件開發中因爲需求的不斷變動,產品的不斷迭代,程序員們爲了應付產品經理不斷變化的需求,提出了一系列的定式。定式一詞最先應該是來源於圍棋中的術語,圍棋的定式本質上也就是經過必定開局方式來提升圍棋的勝率,軟件開發中也是同樣的,經過精心設計的一系列定式,來解決軟件開發中反覆遇到的一些問題,來快速響應產品需求。html
關於「模式」在開發中會會說起兩個詞,設計模式和架構模式,二者是有區別的,個人理解是:設計模式更加關注於微觀,架構模式更加關注於宏觀設計。每每都是架構模式針對的是整個產品層面的設計,設計模式針對的是產品中的某一個功能點的設計,比較常見的MVC和MVP就屬於宏觀架構模式,觀察者和模板模式就屬於微觀設計模式。固然也不是絕對的,設計模式中也可能具備宏觀架構,架構模式中也可能有微觀架構,不過從並集結構來看,大致如此。java
架構模式的設計更加註重於產品業務層面的考慮,常見的框架模式有以下幾種:android
固然,在實際設計中可能會有多種框架設計方式結合一塊兒。關於設計模式和架構模式,推薦兩本書,GOF的《設計模式》和Frank Buschmann的《面向模式的軟件設計》。 git
MVC模式本質上就是屬於框架模式中的分層架構,分層架構其實就是模仿天然界各司其職的思惟方式,這種思惟在互聯網公司的組織架構中尤爲明顯,產品經理負責功能規劃,軟件開發工程師負責開發出對應功能,測試人員保證軟件質量。網絡協議也是一個著名的分層思想 :程序員
Java EE是一個自然的MVC分層架構github
MVC優缺點網上有不少人談,好比MVC具備低耦合性,高內聚性、可維護性強等等,缺點是須要新建的類很是多,C層快速膨脹等等。可是這些都不是致命的缺點,真正致命的缺點後面再談。數據庫
下圖直觀的顯示了MVP和MVC的區別:設計模式
幾句話來區分一下MVP和MVC:網絡
MVP和MVC比有什麼好處?一句話來講:架構
明顯,P層就是MVP種的中心節點,中心節點有什麼好處?
全部的數據都從P層流入,流出,數據流向透明、可控,MVC具備的一優勢MVP都有,而MVC因爲缺乏中心化的數據控制層,因此V層能夠直接和M層通訊,致使數據的流入和流出一團糟,這個就是MVC的致命缺點之一,它自己違背了分層思想中的分層隔離的思想。
Android開發中爲何MVC很差使,一個緣由是Android自己就不是一個自然的MVC架構,它只是一個類MVC架構,M層是數據層,C層是Activity/fragment,V是XML文件,XML的生命週期又須要依賴於Activity/fragment,因此在Activity/fragment中會有對View的操做。 另一個緣由是MVC在Android開發中的侷限,V層會常常對M層作通訊,好比V層中接收M層數據的變化,刷新頁面,這種直接M直接做用於V;有時候可能C層也會直接通知V層來響應數據的變化,若是出現BUG,你很難找到是哪個部分致使的.而MVP模式經過把邏輯縮到P層,經過在View和presenter之間增長一層接口,而減小model和view層的交互,從而把部分邏輯徹底轉接給presenter層,進一步減小了View層的邏輯,這樣依賴View可以真正的作到徹底處理UI方面的工做.
優勢說完了,缺點也一樣明顯。MVP的中中心化的問題在於中心節點承載過多的邏輯,致使P層不斷臃腫,特別是在Android開發中,網絡請求、數據庫操做、控制邏輯等等,P層邏輯不斷增長,最後出現了一個巨型的上帝類。
這個時候你須要一個工具,去簡化P層代碼。
RxJava正是這個工具。RxJava是什麼,簡單來講:
RxJava讓你經過事件流的方式來對數據進行操做,這種操做包括數據的組合、包裝、監聽,而且讓你在同步和異步線程中自如切換。
關於RxJava更多介紹,點擊這裏
RxJava在MVP中起到的做用:
經過對事件流的操做,減化P層的邏輯,減小代碼的耦合
怎麼減小?
一句話來講:
更多關於RxJava的學習參考其它教程。
MVP的實踐基本是基於谷歌官方的架構
具體工程實踐下一篇在講。
軟件架構永遠是服務於業務的,業務的複雜度決定了架構的簡潔性,在不少時候,架構不是萬能的,在沒法用架構解決狀況下,考慮對業務作精簡和分層可以達到很好的效果。MVC架構在分層架構中是佔有很是重要的地位,不過因爲MVC自己的缺點和Android自身架構的侷限性,原生的MVC在Android應用會有很是多的問題,而MVP架構的分層+中心化的架構模式可以在Android的項目中取得良好的效果。