1. 程式人生 > >Android上MVP架構應用的個人理解

Android上MVP架構應用的個人理解

以前覺得自己瞭解了什麼是MVP,還用自己理解MVP的概念寫了一些“應用”。最近看了公司的程式碼,在同事的講解下,才發現自己too young,根本沒有了解到什麼是MVP,完全是為了MVP而MVP。

MVX系列的架構(MVC、MVP、MVVM)目的在於將介面層(User Interface layer)業務邏輯層(Business Logic Layer)資料訪問層(Data access layer)相互分離,以達到高內聚低耦合的思想。至於使用其中哪一個具體的架構僅僅是手段而不是目的。

最終達到的效果就是各個層之間不依賴彼此而獨立存在,每個層都可以單獨拿出去進行測試,甚至直接移植到另一個專案上它也正常工作。

通常介紹MVP架構圖示:

我之前的錯誤使用或者對MVP思想的誤解如下:

  1. Presenter與View之間相互持有。
  2. 認為Java Bean(或稱POJO)就是Model。
  3. 在Presenter進行過於具體的業務處理,Presenter變得臃腫。
  4. 使用混亂,在Presenter中隨處引用Android相關的程式碼(甚至持有Context!)。
  5. View的介面定義過於具體而不是依賴於抽象。

使用後看似像一個有模有樣的MVP,實際上各模組之間還是嚴重耦合,根本無法拿出單一模組進行單元測試。

目前看來,正確用法應該是這樣:

  1. Presenter與View之間使用Contract層約定呼叫的介面,持有的是介面物件而不是對方。
  2. Model層不是實體物件!Model層中可包含有業務邏輯,通常是對一些核心物件的抽象。
  3. Presenter只處理大的邏輯流程,具體的資料業務處理由Model層完成。
  4. Presenter層(或Model層?)不該呼叫Android相關的資源,否則將使測試變得複雜。
  5. View的介面依賴於抽象,比如有一個載入完成的提示介面可以為showLoadCompleteNotification(),而不是showLoadCompleteToast()或者showLoadCompleteText()