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中摻雜太多代碼在大的項目中,組織好代碼結構是最基本的要求,不然,代碼的穩定和擴展就很困難了。
原文鏈接: antonioleiva 翻譯: 伯樂在線 - chris
譯文鏈接: http://blog.jobbole.com/71209/