天天看点

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 模式