V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Bison
V2EX  ›  Android

Android MVP 探究与总结

  •  
  •   Bison · 2015-08-11 18:15:40 +08:00 · 6977 次点击
    这是一个创建于 3174 天前的主题,其中的信息可能已经有所发展或是发生改变。

    导读:在Android的开发过程中,Activity承担了大量地工作。如果对整个项目十分了解,并且在开发过程中有意识地抽离出了一些通用层的话,维护起来还稍微好一点,但实际上我们经常会遇到这样一些情况:维护并迭代已有地商业项目(可能前几期并不是由你开发);UI变动极大(是不是经常Crtl+f到处查找?)...

    如果按照MVC的项目结构来说,Activity应该是属于View这一层。而实质上,它既承担了View,更多地却包含一些Controller的东西在里面。这对于开发与维护来说极度不利,耦合度大高了

    那么有没有什么解决方案呢?答案当然就是本文所讲述的——MVP了

    什么是MVP?

    虽然说MVP已经出来很有一阵了,网上关于讲解这方面的文章也不少,但实际上真动手写起来时,还是有一些不顺畅。这没有更好的办法,唯有多练,多练,多练(重要的事情说三遍)。

    什么是MVP呢?

    MVP是Model, View和Presenter的简称。是MVC模式的演化版。MVP模式把显示逻辑和从业务逻辑层中分离出来,理想状况下,视图层变更替换过程中,可以实现相完全相同的逻辑代码。

    下面看一张图

    MVPLink

    从上图可以看出,Presenter层成了Model与View之间的桥梁,Model与View之间不再直接进行交互。而Presenter持有Model与View的引用,完成了对逻辑地处理。将这个模式代入到Android中,我们可以将他丰富成这样(如下图)

    mvpLink2

    • Model层:包含必要的JavaBean对象,这个不用多说。其次,需要抽离出一个ModelInterface出来,以用于对数据流的操作。当然有接口,自然也需要一个实现类。
    • View层:同样需要抽离出来一个ViewInterface,用于实现UI的交互及刷新。而我们的Activity,Fragment或者View其实就是一个ViewInterface的实现类。所以一般在Activity或fragment中实现ViewInterface接口。
    • Presenter层。presenter英文意思是主持人,在MVP中它是负责逻辑处理并统筹View与Model的一个层。一般来说View与presenter都是一对一的情况,当然这只是一般情况,并不排除复杂界面中Presenter有多个的情景。上面说到Presenter持有View与Model的一个引用,准确地来说,它持有的是ViewInterface与ModelInterface的引用。

      MVP与MVC的区别?

      让我们先来回忆一下MVC的结构

    • M (Model) 实体层

    • V (View) 视图层

    • C (Controller)控制层

    相信对MVC,大家都是非常熟悉了,不再多言,一图以蔽之

    MVP_Link_3

    通过与MVP结构图对比着看可以发现:

    在MVC结构中,Model是可以直接被View操作的。其实这就是MVP与MVC最大的一个区别。

    MVP有什么用?

    或者可以这样问MVP有什么好处?为什么要使用MVP?
    其实通过上面的几张图就不难看出

    • MVP抽离了显示层和逻辑层,降低了耦合
    • MVP结构层次更清晰,可以轻易实现View替换却不带动逻辑层变动。
    • MVP逻辑层是针对接口编程,他更方便于进行单元测试。

    其实,说这么多,都是因为显示层与逻辑层分离带来地便利。

    如何使用MVP?

    都说MVP抽离了层结构,降低了耦合度,那么它到离是如何抽离的?当然是通过接口了。

    Presenter中通过对接口的操作,可以完全不关心View层与Model层的具体实现,只需要处理对应逻辑就可以了。而在View层中,即Android的Activity与Fragment中,只需要持有一个Presenter的对象,以完成界面交互。这样咱们的View层就变得非常地薄了。所以,总结了一下,使用MVP,可以从以下几个方向思考:

    • 创建实体JavaBean对象.这个跟以往地MVC没有多少区别,不多说。
    • 抽离出View的接口,即ViewInterface.如何抽离?View层主要负责与用户地交互工作。那么落到具体上其实就是对UI的控制与事件地监听。首先就需要把我们原来项目中的事件全部抽离,如:点击,长按,滑动...,而所谓地UI控制,即提供对View的操作方法,如进度条地显示隐藏,弹窗地出现与消失等等。
    • 抽离Model的接口,即ModelInterface.ModelInterface需要有些什么?说白了,其实就是对数据地读取与写入。比如通过网络协议获取一个列表集合,或者是从本地文件中读取一段字符串等等。在Presenter因为操作接口地缘故,所以他根本不用关心数据地获取与存储具体实现。同样,这里分析一下业务逻辑,将其抽离成接口
    • 实现ModelInterface与ViewInterface. 这个肯定是必须地,ModelInterface的实现不用多说,而ViewInterface的实现也很简单,就是在Activity或Fragment中调用Presenter暴露出来地方法而已。

    以上,MVP理论上来说可以实现在多人协作项目中,让写UI的人与写逻辑的人分工而行,也更方便于在开发过程中进行单元测试。鉴于文章长度问题,具体地实际应用我们放在下章再说,我们一起来一步步实现一个MVP模式的Android应用

    6 条回复    2015-10-08 19:42:28 +08:00
    nicktogo
        1
    nicktogo  
       2015-08-11 19:16:15 +08:00 via Android
    坐等实现讲解
    WispZhan
        2
    WispZhan  
       2015-08-11 20:33:26 +08:00
    直接看android studio 1.3 支持的 databinding 和 mvvm 吧。
    Bison
        3
    Bison  
    OP
       2015-08-12 16:10:42 +08:00
    @WispZhan MVVM中的ViewModel其实就是MVP中的Presenter。只不过MVP中Presenter能操作Model层,但Model层不能操作Presenter.而MVVM中的ViewModel与Model是支持双向绑定的。于Android而说,MVVM估计未来会更受欢迎一些。
    Bison
        4
    Bison  
    OP
       2015-08-12 16:10:59 +08:00
    @nicktogo 感谢支持
    HsienJiajun
        5
    HsienJiajun  
       2015-08-19 11:13:26 +08:00
    用过 mvp ,要写很多接口,现在 android 官方出了 databinding ,以后应该会引导大家往 mvvm 走吧。
    kaedea
        6
    kaedea  
       2015-10-08 19:42:28 +08:00
    MVP 还可以进一步优化, P 和 V 的交互
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2832 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 14:06 · PVG 22:06 · LAX 07:06 · JFK 10:06
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.