MVP for Android: 如何組織顯示層的內容

LeBron_Six發表於2016-03-15

MVP(Model View Presenter)模式是從眾所周知的MVC(Model View Controller)模式中派生出來的,目前在Android開發中變得越來越重要。越來越多的人在談論MVP,但實際上可靠的、結構化的資料很少。這就是我寫這個部落格的原因,通過它鼓勵大家討論,然後把我們學到的MVP知識以最好的方式應用到我們專案中來。

什麼是MVP?

MVP模式允許從業務邏輯中拆分出表示(presentation)層,因此,所有關於UI介面的東西可以從中分離出來。理想的MVP模式就是在相同的邏輯下,由於View是可互換的,可以有完全不一樣的展示效果。首先要澄清的是MVP並不是體系結構模式,它只負責表示層。在任何情況下,我們都可以在專案中使用它。


為什麼要使用MVP?

在Android開發中有一個問題是來源於Android 中邏輯介面與資料訪問機制是緊密耦合的,我們可以找到像CursorAdapter這樣極端的一個例子,這是一種混合式介面卡,它既融合了介面卡,又有View的成分,而cursor很大程度上應該是訪問層的,所以應該降低資料訪問層的深度。

為了我們的應用程式便於擴充套件和維護,我們應該定義各個分離層。畢竟我們還不知道以後會加入什麼邏輯,是從資料庫檢索資料?還是從Web Service獲取?所以我們必須重做整個檢視。

MVP模式使得檢視獨立於我們的資料來源,我們可將應用程式劃分為至少三個不用的層次,便於我們能夠獨立測試他們。採用MVP模式我們可以把大部分的邏輯從Activity中分離出來,使得我們可以不用藉助單元測試(instrumentation)來單獨測試它。


如何把MVP應用到Android?

一切問題開始變得更加分散,有點複雜了。實現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中摻雜太多的程式碼,組織好程式碼結構是開發的最基本的要求,否則,想實現程式碼的穩定性和可擴充套件性就很麻煩了了。

原文:MVP for Android: how to organize the presentation layer

另附:Android框架模式之MVC與MVP

相關文章