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

前言

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

你們對MVC的架構模式再熟悉不過。今天咱們就學習一下MVP架構模式。java

MVC和MVP之間的對比

mvc和MVP之間的對照

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

  • 一、爲了使得視圖接口能夠與模型和控制器進行交互,控制器執行一些初始化事件
  • 二、用戶經過視圖(用戶接口)執行一些操做
  • 三、控制器處理用戶行爲(能夠用觀察着模式實現)並通知模型進行更新
  • 四、模型引起一些事件,以便將改變發告知視圖
  • 五、視圖處理模型變動的事件,而後顯示新的模型數據
  • 六、用戶接口等待用戶的進一步操做

MVP的優點

  • 一、模型與視圖徹底分離,咱們能夠修改視圖而不影響模型
  • 二、能夠更高效地使用模型,由於因此的交互都發生在一個地方——Presenter內部
  • 三、咱們能夠將一個Presener用於多個視圖,而不須要改變Presenter的邏輯。這個特性很是的有用,由於視圖的變化老是比模型的變化頻繁。
  • 四、若是咱們把邏輯放在Presenter中,那麼咱們就能夠脫離用戶接口來測試這些邏輯(單元測試)

MVP的問題

因爲對視圖的渲染放在了Presenter中,因此視圖和Persenter的交互會過於頻繁。android

還有一點你須要明白,若是Presenter過多地渲染了視圖,每每會使得它與特定的視圖的 聯繫過於緊密。一旦視圖須要變動,那麼 Presenter也須要變動了。好比說,本來用來呈現Html的Presenter如今也須要用於呈現Pdf了,那麼視圖頗有可能也須要變動。git

一個簡單的登錄實例

效果圖:github

效果圖.gif

目錄結構

mpv目錄結結構

mvp用例項目結構

服務器對岸用例測試LoginService

![服務器對岸用例測試LoginService
](http://upload-images.jianshu....數據庫

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。除了發起請求功能外,通常咱們還須要一個取消請求的方法。mvc

因此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/androidsta...

服務端測試項目地址:

http://download.csdn.net/down...

參考連接:

http://www.360doc.com/content...

遺留問題

  • 若是代碼量比較多,是否考慮mvp怎麼複用的,若是複用是否會增長耦合度?

總結:過多的追求模式有時候也會拔苗助長,MVC應用有時候也有太多的寬泛。

mvp參考

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

MVP+Retrofit+Rxjava實戰

若是您以爲頗有幫助,歡迎隨時撩我。

相關文章
相關標籤/搜索