MVP(Model View Presenter)模式是著名的MVC(Model View Controller)模式的一個演化版本,目前它在Android應用開發中越來越重要了,大家也都在討論關於MVP的理論,只是結構化的資料非常少。這就是我寫這篇部落格的原因,我想鼓勵大家多參與討論,然後把MVP模式運用在專案開發中。
什麼是MVP?
MVP模式可以分離顯示層和邏輯層,所以功能介面如何工作與功能的展示可以實現分離,MVP模式理想化地可以實現同一份邏輯程式碼搭配不同的顯示介面。首先要澄清就是MVP不是一個結構化的模式,它只是負責顯示層而已,任何時候都可以在自己的專案結構中使用MVP模式。
為什麼要使用MVP?
我們知道在Android上邏輯介面和資料存取是緊耦合的,這個問題可以看看CursorAdapter這個例子,它既融合了介面卡,同時也有顯示的成分,而cursor很大程度上應該是資料資料存取層的。
對於一個可擴充套件、穩定的應用來說,我們需要定義各個分離層,畢竟,我們不知道以後還要加入什麼邏輯,是從本地資料庫檢索資料?還是從遠端的web Service中?
MVP模式可以讓顯示介面和資料分離,我們開發的應用可以分離至少三層,這樣也可以進行獨立測試。有了MVP我們就可以從Activity中分離大部分程式碼,而且不用單元測試可以對每個模組進行單獨測試了。
怎麼在Android上實現MVP?
說到這裡,問題就有點複雜了。實現MVP的方式有很多種,每個人都可以根據自己的需求和自己喜歡的方式去修正MVP的實現方式,它可以隨著Presenter的複雜程度變化。
在View中需不需要控制進度條?或者是在Presenter處理?還有,誰來決定Action Bar該顯示什麼操作?這是一個艱難的決定。這裡我會展示我自己的做法,但是我希望本文成為一個討論如何應用MVP的地方,因為目前為止還沒有實現MVP的標準方式。
Presenter
Presenter主要作為溝通View和Model的橋樑,它從Model層檢索資料後,返回給View層,但是不想典型的MVC結構,因為它也可以決定與View層的互動操作。
View
View通常來說是由Activity實現的(也許是Fragment,VIew,取決於app的整體結構),它會包含一個Presenter的引用,最理想的是Presenter由一個依賴注入管理器提供,比如Dagger,不過如果不用注入器的話,就需要獨立建立Presenter物件了。View要做的就只是在每次有介面呼叫的時候(比如按鈕點選後)呼叫Presenter的方法。
Model
對於一個結構化的APP來說,Model主要是通向主領域層或者邏輯層的通道,如果使用了Uncle Bob clean architecture的話,Model就可能是一個實現了用例場景的互動工具,這也是我將要在另一篇文章中討論的一個主題。現在,只要把它看做是給View提供資料的容器就對了。
一個例子
鑑於已經解釋的太長了,本人寫了一個例子an MVP example on Github,由一個登入介面組成,可以驗證資料然後進入一個帶有列表的主介面,資料來自Model,因為比較簡單,所以本文就不講程式碼了,但是如果讀者覺得還是很難理解的話,我還可以再寫一篇文章詳細介紹。
總結
在Android上要分離介面和邏輯不容易實現,但是Model-View-Presenter模式可以更簡單的防止在Activity中摻雜太多程式碼在大的專案中,組織好程式碼結構是最基本的要求,不然,程式碼的穩定和擴充套件就很困難了。