前言
最近項目開始用mvp模式進行開發,為什麼不用mvc?你懂得。經過幾個版本疊代,邏輯已經被嵌套的面目全非,無法下手。下面簡單介紹,畢竟網上已有好多分享!
随着UI建立技術的功能日益增強,UI層也履行着越來越多的職責。為了更好地細分
視圖(View)與模型(Model)的功能,讓View專注于處理資料的可視化以及與使用者的互動,同時讓Model隻關心資料的處理,基于MVC概念的MVP(Model-View-Presenter)模式應運而生。
話說你懂mvc嗎?什麼是mvc?
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiQDOxEzX3xCZlhXam9VbsUmepNXZy9CXwJWZ3xCdh1mcvZ2Lc1zaHRGcWdUYuVzVa9GczoVdG1mWfVGc5RHLwIzX39GZhh2csATMflHLwEzX4xSZz91ZsAzMfRHLGZkRGZkRfJ3bs92YskmNhVTYykVNQJVMRhXVEF1X0hXZ0xiNx8VZ6l2cssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnL5UjN2kzYmRzMjFWN4QjNzYzX0IzMyETM0AzLcFTMyIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjLyM3Lc9CX6MHc0RHaiojIsJye.png)
在MVP模式裡通常包含4個要素:
(1)View:負責繪制UI元素、與使用者進行互動(在Android中展現為Activity,fragment);
(2)View interface:需要View實作的接口,View通過View interface與Presenter進行互動,降低耦合,友善進行單元測試,(向面向接口開發靠攏);
(3)Model:負責存儲、檢索、操縱資料(同時也實作一個Model interface用來降低耦合);
(4)Presenter:作為View與Model互動的中間紐帶,處理與使用者互動的負責邏輯。
下面類圖是mvp的兩種方式。一種初級版本,另一種是官方推薦的一種版本。完全遵從mvp模式,肯定會舍棄一些友善性(發起網絡,在model層進行,之前到處都可以發網絡activity 中,Fragment中),換來的是高品質,高可測,可維護以及代碼健壯,美觀,可讀性……
方式一
類圖1.初級版本 mvp三層對應各自上層接口
參考demo:
model— model interface,presenter—-presenter Interface view—-View Interface. 各層之間通信使用上層接口,這也是提倡的面向接口程式設計。
缺點:
一個activity 對應 6個類( 3個接口,3個實作類)
優點:
可複用性高(接口職責要單一)
上面uml推薦第一版可以這樣搞,團隊熟悉了mvp寫法,就可以用下面官方提供的寫法。當然直接走下面也不攔着你。
方式2
參考 : 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 就可以調用。