Android架构——MVP架构一点理解

1. 框架初识

首先讲框架之前,要问自己一个问题,为什么要用到框架?框架的使用能给自己的开发带来什么好处

在撰写代码时,会发现随着代码越来越多,理清代码的逻辑越来越困难,且想尽可能的少些Activity。且随着迭代轮次的增多,功能也会随之增删,这时候如果没有一个好的架构,在迭代过程中程序将会被破坏,工作展开极其困难。

MVP框架又是什么
在撰写代码时,要避免创建神类。即避免创建无所不知,无所不能的上帝类。如果一个类需要花费时间从其他类中通过Get()和Set()检索数据(也就是说,需要深入业务并且告诉它们如何去做),所以是否应该把这些功能函数更好的组织到其它类而不是上帝类中。Activity就是上帝类,随着Activity代码量随时间不断增加,最后会成为一个无法重用的组件的集合。上帝类的维护成本很高,很难理解正在进行的操作,并且难以测试和扩展。

Activity中同时存在业务逻辑和UI逻辑,不仅造成Activity臃肿,且导致数据绑定等操作变得复杂,所以我们首先要解决的一个问题就是分离关注点,而MVP架构正是个中翘楚。

MVP模式将Activity中的业务逻辑和UI逻辑分离开来,让Activity只做UI逻辑的处理,其他业务逻辑由Presenter层处理,这带来了如下优点:

  • 分离了视图逻辑和业务逻辑,降低了耦合
  • Activity只处理生命周期的任务,代码变得简洁
  • 视图逻辑和业务逻辑分别抽象到了View和Presenter的接口中,提高代码的阅读性
  • Presenter被抽象成接口,可以有多种具体的实现,所以方便进行单元测试
  • 把业务逻辑抽到Presenter中去,避免后台线程引用着Activity导致Activity的资源无法被系统回收从而引起内存
    泄露和OOM。

1.1 MVP概念

MVP代表ModelViewPresenter

  • View层:负责处理用户事件和视图部分的展示,即显示数据的地方。得到数据后,数据传递到view层,显示数据。同时view层的点击事件等处理也在这里出现,真正的数据处理在model层中处理。在Android中,它可能是Activity或者Fragment类

  • Model层:
    负责访问数据,即单纯的处理数据,不接手其他任务。数据可以是远端的Server API,本地数据库或者SharedPreference等。

  • Presenter层:
    是连接(或适配)View和Model的桥梁。M层获得数据后交给P层,P层再交给View层。同理,View层的点击事件等处理通过P层去通知M层,让其进行数据处理。

在MVP中,View和Presenter是一一对应的(MVVM是一对多的)

MVP分离了view和model层,Presenter层充当了桥梁的角色,View层只负责更新界面即可,这里的View我们要明白只是一个viewinterface,它是视图的接口,这样我们在做单元测试的时候可以非常方便编写Presenter层代码

在这里插入图片描述

三层之间的调用顺序为view->presenter->model不可反向调用!不可跨级调用!
model层如何反馈给Presenter层?Presenter如何操控View层?如下图所示
在这里插入图片描述
底层不会直接给上一层做反馈,而是通过View,Callback为上级做出了反馈,这样就解决了请求数据与更新界面的异步操作。图中View和Callback都是以接口的形式存在。

View中定义了Activity的具体操作,主要将请求到的数据在界面中更新之类

Callback中定义了请求数据是反馈的各种状态:成功,失败,异常等

MVP初步架构目录图
上图是我简要搭建的MVP模式下常见的目录结构,其中:

  • base :存放app的基类
  • common:存放异常常量,接口,公用的东西
  • bean:用来存放定义的数据
  • contract:连接V层和P层的一个契约包
  • parser:存放一些json等字符串的解析
  • presenter:P层,负责连接V层和M层,中心管理器。
  • ui:这个包下面主要存放一下跟UI相关的部分
    • activity:存放Activity类
    • fragment:存放Fragment类
    • adapter:适配器类
  • utils:存放工具类
  • widget:存放自定义的一些组件

2. 贫困版MVP模式

MVP架构的中心思想是面向接口编程,调用层使用接口对象,去调用接口方法,实现层去实现接口方法,并在调用层实例化。

在这里插入图片描述
在MVP架构中:我们要把MVP层的接口方法抽象出来,同时分别写出三个接口的实现类(V层一般是activity或者fragment继承view层接口),其中V层持有P层的接口对象,P层持有V层与M层的接口对象,M层为P层提供数据。三者之间形成了MVP架构,三者之间通过P层相互连接。

这里我们先实现一个简单的MVP架构

  • 先定义一个接口,在该接口中实现MVP中的所有接口:
interface View {
   
        //显示数据
        void showData(String str);

    }

    interface Presenter  {
   
         //通知model要获取数据并把model返回的数据交给view层
        void getData();

    }

    interface Model {
   
         //获取数据
       String doData();

    }
  • 创建一个类,实现P接口,这里即P层,P层持有V层和M层接口对象
public class TestPresenter implements TestContract.Presenter {
   

    private TestContract.Model model;	//持有M层接口对象
    private TestContract.View view;		// 持有V层接口对象

    public TestPresenter (TestContract.Model model, TestContract.View view) {
   
        this.model = model;
        this.view = view;
    }


    @Override
    public void getData() {
   
        view.showData(model.doData());
  • 7
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值