抛弃Mvc ,初尝 Mvp 模式

时间:2022-09-06 21:14:49

前言

最近项目开始用mvp模式进行开发,为什么不用mvc?你懂得。经过几个版本迭代,逻辑已经被嵌套的面目全非,无法下手。下面简单介绍,毕竟网上已有好多分享!

随着UI创建技术的功能日益增强,UI层也履行着越来越多的职责。为了更好地细分
视图(View)与模型(Model)的功能,让View专注于处理数据的可视化以及与用户的交互,同时让Model只关心数据的处理,基于MVC概念的MVP(Model-View-Presenter)模式应运而生。

话说你懂mvc吗?什么是mvc?

抛弃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交互的中间纽带,处理与用户交互的负责逻辑。

抛弃Mvc ,初尝 Mvp 模式

下面类图是mvp的两种方式。一种初级版本,另一种是官方推荐的一种版本。完全遵从mvp模式,肯定会舍弃一些方便性(发起网络,在model层进行,之前到处都可以发网络activity 中,Fragment中),换来的是高质量,高可测,可维护以及代码健壮,美观,可读性……

方式一

类图1.初级版本 mvp三层对应各自上层接口

抛弃Mvc ,初尝 Mvp 模式

参考demo:

model— model interface,presenter—-presenter Interface view—-View Interface. 各层之间通信使用上层接口,这也是提倡的面向接口编程。

缺点:

一个activity 对应 6个类( 3个接口,3个实现类)

优点:

可复用性高(接口职责要单一)

上面uml推荐第一版可以这样搞,团队熟悉了mvp写法,就可以用下面官方提供的写法。当然直接走下面也不拦着你。

方式2

抛弃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 就可以调用。
抛弃Mvc ,初尝 Mvp 模式

当然团队内部也讨论过,是否需要完全遵从google mvp 规范。这个看团队取舍了。个人建议,专业人士做专业事情,尽量遵从google mvp规范走。

以上只有uml类图,没有源码理解起来不容易。想深入理解请自行下载 google mvp