天天看点

android MVP框架

原文地址:http://blog.csdn.net/guxiao1201/article/details/40147209

在开发android应用时,相信很多同学遇到和我一样的情况,虽然项目刚开始构架时自认为mvc层级分的特别明确,但最终往往是一个activity有好几百行代码,而且逻辑和ui显示完全混杂在一起,导致后续项目的维护成本巨大。一个偶然的机会看到有种mvp模式(mode-view-presenter)可以比mvc更好的解耦和,然后好奇的研究了下这个模式并尝试在现在项目中进行推广。下面就把自己目前学习到知识总结出来。

mvp模式将分为两篇博客进行总结:

<a target="_blank" href="http://blog.csdn.net/guxiao1201/article/details/40147209">(一)android开发mvp模式解析</a>

<a target="_blank" href="http://blog.csdn.net/guxiao1201/article/details/40151457">(二)android开发mvp模式实践</a>

一、mvp简介

我理解的mvp是由mvc优化衍生出来的一种模式,mvp将mvc中的controller层进行了优化而生成了presenter。presenter单词翻译为“提出者;任命者;主持人”,presenter层和mvc的controller一样,负责核心逻辑,但不一样的是presenter通过接口协议进行数据传递,并阻断了view和model的直接联系,从而使view和model更加专注于自身业务逻辑。

二、mvp结构

android MVP框架

view

view通常来说就是有activity、fragment实现的,view会包含一个或多个presenter的引用来满足视图的业务逻辑。view和presenter的交互是双向的,即view层可以调用presenter的逻辑方法,presenter也可以控制view的显示。

presenter

presenter作为model和view的桥梁,负责从model拿到数据进行处理并返回给view。但presenter和其他两层的沟通是通过接口协议进行的,所以每个presenter中通常会包涵一个或多个接口协议。

model

和mvc一样,作为数据仓库只负责对app数据进行处理。

android MVP框架

entities:app中的业务类。

use cases:负责从将entities中的数据进行处理和包装。

presenters:从use cases获取处理好的数据,然后根据需求逻辑为ui提供合适的数据。

ui:从presenters获取处理好的最终数据,和用户进行直接交互。

这四层设计的原则是代码调用只能从外圆向内圆扩展,内圆不能干预也不需关心外圆的功能逻辑,这符合mvp的思想,use cases和presenters将entities和ui间隔分离,从而使entities和ui只需关心自身逻辑,数据处理完全交给其他两层。

这里,有些同学可能会有疑问,说好的presenters为什么会有use cases出来搅局?其实这也是我选择这个工程当做示例的目的,看了好多mvp文章,都在讲presenter如何通过接口协议和其他两层进行交互,但大都忽略了presenter层自身的构架,因为仅仅套用mvp模式,虽然在一定程度上降低view的耦合度,但因为presenter既要处理数据,又要结合需求控制ui交互,所以很可能出现presenter逻辑的冗余。后文的示例工程在presenter和model之间包装了use

cases,将数据逻辑处理交给usecases从而让presenter更专心于ui交互。

三、mvp vs mvc

在把原本mvc模式的代码修改为mvp模式后,总结这两个模式在实际使用过程中的不同点基本上总结为两点:

各个层之间通过接口协议进行沟通;

view和model不再进行直接交互;

四、总结

mvp将会为你的代码带来如下好处:

view和model之间的耦合度降低,使其更关注自身业务逻辑;

便于单元测试;

代码复用率提高;

代码框架更适用于快速迭代开发;

参考资料:

<a target="_blank" href="http://yeungeek.com/2014/06/17/mvp-android/">android上的mvp模式</a>

<a target="_blank" href="http://www.infragistics.com/community/blogs/todd_snyder/archive/2007/10/17/mvc-or-mvp-pattern-whats-the-difference.aspx">mvc or mvp pattern - whats the difference?</a>

<a target="_blank" href="http://www.infragistics.com/community/blogs/todd_snyder/archive/2007/10/17/mvc-or-mvp-pattern-whats-the-difference.aspx">architecting android...the clean way?</a>

下一篇: 打包volley

继续阅读