死磕安卓前序:MVP架構探究之旅—基礎篇

codeGoogle發表於2018-06-08

前言

瞭解相關更多技術,可參考《我就死磕安卓了,怎麼了?》,接下來談一談我們來學習一下MVP的基本認識。

大家對MVC的架構模式再熟悉不過。今天我們就學習一下MVP架構模式。

MVC和MVP之間的對比

mvc和MVP之間的對照

什麼是MVP(Model View Presenter)模式?

  • 1、為了使得檢視介面可以與模型和控制器進行互動,控制器執行一些初始化事件
  • 2、使用者通過檢視(使用者介面)執行一些操作
  • 3、控制器處理使用者行為(可以用觀察著模式實現)並通知模型進行更新
  • 4、模型引發一些事件,以便將改變發告知檢視
  • 5、檢視處理模型變更的事件,然後顯示新的模型資料
  • 6、使用者介面等待使用者的進一步操作

MVP的優勢

  • 1、模型與檢視完全分離,我們可以修改檢視而不影響模型
  • 2、可以更高效地使用模型,因為所以的互動都發生在一個地方——Presenter內部
  • 3、我們可以將一個Presener用於多個檢視,而不需要改變Presenter的邏輯。這個特性非常的有用,因為檢視的變化總是比模型的變化頻繁。
  • 4、如果我們把邏輯放在Presenter中,那麼我們就可以脫離使用者介面來測試這些邏輯(單元測試)

MVP的問題

由於對檢視的渲染放在了Presenter中,所以檢視和Persenter的互動會過於頻繁。

還有一點你需要明白,如果Presenter過多地渲染了檢視,往往會使得它與特定的檢視的 聯絡過於緊密。一旦檢視需要變更,那麼 Presenter也需要變更了。比如說,原本用來呈現Html的Presenter現在也需要用於呈現Pdf了,那麼檢視很有可能也需要變更。

一個簡單的登陸例項

效果圖:

效果圖.gif

目錄結構

mpv目錄結結構

mvp用例專案結構

伺服器對岸用例測試LoginService

伺服器對岸用例測試LoginService

P層

P層.png

v層

v層.png

acitivity.png

M層

M層.png

看起來要複雜的比較多。程式碼量也相對比較大。但是如果用到大專案中我們就能顯示出優勢了。接下來進行mvp的封裝。

時間久了,我們就會發現mvp會帶來極大的方面:在MVP中,由於業務邏輯都在Presenter裡,我們完全可以寫一個PresenterTest的實現類繼承Presenter的介面,現在只要在Activity裡把Presenter的建立換成PresenterTest,就能進行單元測試了,測試完再換回來即可。萬一發現還得進行測試,那就再換成PresenterTest吧。

總結

M、V、P三層各有什麼特點。

Model層

這一層主要就是負責向資料來源(一般為伺服器/資料庫,下同)發起獲取資料請求,並且把獲取的資料或者錯誤資訊回撥給持有的Presenter。除了發起請求功能外,一般我們還需要一個取消請求的方法。

所以Model層主要的功能是:

  1. 向資料來源發起請求;
  2. 取消該請求;
  3. 通知Presenter處理結果。

Presenter層

這層主要負責通知Model層向伺服器發起請求並接收Model層回撥的資料或者錯誤資訊,並且這一層還要負責把資料或者錯誤資訊處理後回撥到View層,由View層負責顯示。 一般在網路請求中的錯誤資訊分為兩種,一種是網路裝置的網路狀態錯誤,無法傳送請求;另外一種是伺服器拒絕了這次請求。所以Presenter的主要功能是:

  1. 通知Model層向伺服器發起請求;
  2. 接收Model層返回的資料(伺服器可能返回資料或者拒絕服務資訊);
  3. 接收Model層返回的網路錯誤資訊;
  4. 通知Model層取消這次請求;
  5. 通知View接收處理後的資料。

View層

在MVP模式中,View層是一個介面。它的首要任務是把Presenter處理後的資料傳到具體的原生控制元件中顯示,並且控制是否顯示載入進度條。 所以View層的主要功能是:

  1. 顯示/隱藏進度條。
  2. 接收Presenter處理後的正確資料。
  3. 接收Presenter返回的網路錯誤資訊。
  4. 接收Presenter返回的伺服器拒絕服務資訊。

MVP模式的核心思想

MVP把Activity中的UI邏輯抽象成View介面,把業務邏輯抽象成Presenter介面,Model類還是原來的Model。

在MVP模式中Activity的功能就是響應生命週期和顯示介面,具體其他的工作都丟到了Presenter層中進行完成,Presenter其實是Model層和View層的橋樑。

專案地址:

https://github.com/androidstarjack/MvpSimpleStudy

服務端測試專案地址:

http://download.csdn.net/download/androidstarjack/9966557

參考連結:

http://www.360doc.com/content/13/0808/13/7427585_305589280.shtml

遺留問題

  • 如果程式碼量比較多,是否考慮mvp怎麼複用的,如果複用是否會增加耦合度?

總結:過多的追求模式有時候也會適得其反,MVC應用有時候也有太多的寬泛。

(歡迎關注學習和交流)

mvp參考

MVP+Dagger2+Retrofit2.0+Rxjava看這一個例子就夠了

MVP+Retrofit+Rxjava實戰

相信自己,沒有做不到的,只有想不到的

微信公眾號:終端研發部

技術+職場

如果您覺得很有幫助,歡迎隨時撩我。

相關文章