天天看點

android 抛棄Mvc ,初嘗 Mvp 模式

前言

最近項目開始用mvp模式進行開發,為什麼不用mvc?你懂得。經過幾個版本疊代,邏輯已經被嵌套的面目全非,無法下手。下面簡單介紹,畢竟網上已有好多分享!

随着UI建立技術的功能日益增強,UI層也履行着越來越多的職責。為了更好地細分

視圖(View)與模型(Model)的功能,讓View專注于處理資料的可視化以及與使用者的互動,同時讓Model隻關心資料的處理,基于MVC概念的MVP(Model-View-Presenter)模式應運而生。

話說你懂mvc嗎?什麼是mvc?

android 抛棄Mvc ,初嘗 Mvp 模式

在MVP模式裡通常包含4個要素:

(1)View:負責繪制UI元素、與使用者進行互動(在Android中展現為Activity,fragment);
 (2)View interface:需要View實作的接口,View通過View interface與Presenter進行互動,降低耦合,友善進行單元測試,(向面向接口開發靠攏);
 (3)Model:負責存儲、檢索、操縱資料(同時也實作一個Model interface用來降低耦合);
 (4)Presenter:作為View與Model互動的中間紐帶,處理與使用者互動的負責邏輯。      
android 抛棄Mvc ,初嘗 Mvp 模式

下面類圖是mvp的兩種方式。一種初級版本,另一種是官方推薦的一種版本。完全遵從mvp模式,肯定會舍棄一些友善性(發起網絡,在model層進行,之前到處都可以發網絡activity 中,Fragment中),換來的是高品質,高可測,可維護以及代碼健壯,美觀,可讀性……

方式一

類圖1.初級版本 mvp三層對應各自上層接口

android 抛棄Mvc ,初嘗 Mvp 模式

參考demo:

model— model interface,presenter—-presenter Interface view—-View Interface. 各層之間通信使用上層接口,這也是提倡的面向接口程式設計。

缺點:

一個activity 對應 6個類( 3個接口,3個實作類)

優點:

可複用性高(接口職責要單一)

上面uml推薦第一版可以這樣搞,團隊熟悉了mvp寫法,就可以用下面官方提供的寫法。當然直接走下面也不攔着你。

方式2

android 抛棄Mvc ,初嘗 Mvp 模式

參考 : ​​demo android-architecture-todoapp-mvp​​

貼代碼更直覺,TaskDetailContract

/**
 * This specifies the contract between the view and the presenter.
 */
public interface TaskDetailContract {

    interface View extends BaseView<Presenter> {

        void setLoadingIndicator(boolean active);

        void showMissingTask();

        void hideTitle();

        void showTitle(String title);

        void hideDescription();

        void showDescription(String description);

        void showCompletionStatus(boolean complete);

        void showEditTask(String taskId);

        void showTaskDeleted();

        void showTaskMarkedComplete();

        void showTaskMarkedActive();

        boolean isActive();
    }

    interface Presenter extends BasePresenter {

        void editTask();

        void deleteTask();

        void completeTask();

        void activateTask();
    }
}      

使用起來就很友善了

p實作方式
class TaskDetailPresenter implements TaskDetailContract.Presenter 

v實作方式
Class TaskDetailFragment extends Fragment implements TaskDetailContract.View      

缺點:

了解起來有點繞,這也算不上缺點

優點:

使用一個連結器概念,将view 和 presenter 整合到連接配接器中。功能内聚性高。

符合官方規範,可擴充性高。

下面方式屬于半成品,隻有 view ,presenter 沒有 Model層,網絡請求放到presenter中,缺點就是網絡放入p層進行請求處理,同一個項目中多個地方調用同一個請求連結需要調用多次,如果有model層,就可以拿來複用。隻需拿到 model interface 就可以調用。

android 抛棄Mvc ,初嘗 Mvp 模式