Android上MVP架構應用的個人理解
阿新 • • 發佈:2018-12-26
以前覺得自己瞭解了什麼是MVP,還用自己理解MVP的概念寫了一些“應用”。最近看了公司的程式碼,在同事的講解下,才發現自己too young,根本沒有了解到什麼是MVP,完全是為了MVP而MVP。
MVX系列的架構(MVC、MVP、MVVM)目的在於將介面層(User Interface layer)、業務邏輯層(Business Logic Layer)、資料訪問層(Data access layer)相互分離,以達到高內聚低耦合的思想。至於使用其中哪一個具體的架構僅僅是手段而不是目的。
最終達到的效果就是各個層之間不依賴彼此而獨立存在,每個層都可以單獨拿出去進行測試,甚至直接移植到另一個專案上它也正常工作。
通常介紹MVP架構圖示:
我之前的錯誤使用或者對MVP思想的誤解如下:
- Presenter與View之間相互持有。
- 認為Java Bean(或稱POJO)就是Model。
- 在Presenter進行過於具體的業務處理,Presenter變得臃腫。
- 使用混亂,在Presenter中隨處引用Android相關的程式碼(甚至持有Context!)。
- View的介面定義過於具體而不是依賴於抽象。
使用後看似像一個有模有樣的MVP,實際上各模組之間還是嚴重耦合,根本無法拿出單一模組進行單元測試。
目前看來,正確用法應該是這樣:
- Presenter與View之間使用Contract層約定呼叫的介面,持有的是介面物件而不是對方。
- Model層不是實體物件!Model層中可包含有業務邏輯,通常是對一些核心物件的抽象。
- Presenter只處理大的邏輯流程,具體的資料業務處理由Model層完成。
- Presenter層(或Model層?)不該呼叫Android相關的資源,否則將使測試變得複雜。
- View的介面依賴於抽象,比如有一個載入完成的提示介面可以為
showLoadCompleteNotification()
,而不是showLoadCompleteToast()
或者showLoadCompleteText()
!