Android开发MVP模式解析

zy7252561 10年前
   <p>在开发Android应用时,相信很多同学遇到和我一样的情况,虽然项目刚开始构架时自认为MVC层级分的特别明确,但最终往往是一个Activity有好几百行代码,而且逻辑和UI显示完全混杂在一起,导致后续项目的维护成本巨大。一个偶然的机会看到有种MVP模式(Mode-View-Presenter)可以比MVC更好的解耦和,然后好奇的研究了下这个模式并尝试在现在项目中进行推广。下面就把自己目前学习到知识总结出来。</p>    <p>MVP模式将分为两篇博客进行总结:</p>    <p><a href="http://www.open-open.com/lib/view/open1461504312806.html"><span style="color:#3366ff">(一)Android开发MVP模式解析</span></a></p>    <p><a href="http://www.open-open.com/lib/view/open1461504476218.html"><span style="color:#3366ff">(二)Android开发MVP模式实践</span></a></p>    <p><strong>一、MVP简介</strong></p>    <p>我理解的MVP是由MVC优化衍生出来的一种模式,MVP将MVC中的Controller层进行了优化而生成了Presenter。Presenter单词翻译为“提出者;任命者;主持人”,Presenter层和MVC的Controller一样,负责核心逻辑,但不一样的是Presenter通过接口<strong>协议</strong>进行数据传递,并阻断了View和Model的直接联系,从而使View和Model更加专注于自身业务逻辑。</p>    <p><strong>二、MVP结构</strong></p>    <p><strong><img alt="" src="https://simg.open-open.com/show/a21ea06e7bf96725313be2bfaa871d01.png"></strong></p>    <p><strong><span style="color:#009900">V</span></strong><strong><span style="color:#009900">iew</span></strong></p>    <p>View通常来说就是有Activity、Fragment实现的,View会包含一个或多个Presenter的引用来满足视图的业务逻辑。View和Presenter的交互是双向的,即View层可以调用Presenter的逻辑方法,Presenter也可以控制View的显示。</p>    <p><strong><span style="color:#009900">Presenter</span></strong></p>    <p>Presenter作为Model和View的桥梁,负责从Model拿到数据进行处理并返回给View。但Presenter和其他两层的沟通是通过接口协议进行的,所以每个Presenter中通常会包涵一个或多个接口协议。</p>    <p><strong><span style="color:#009900">Model</span></strong></p>    <p>和MVC一样,作为数据仓库只负责对APP数据进行处理。</p>    <p><a href="http://www.open-open.com/lib/view/open1461504476218.html"><span style="color:#3366ff">Android开发MVP模式实践</span></a>中的示例将APP分为以下四层。</p>    <p><strong><span style="color:#009900"><img alt="" src="https://simg.open-open.com/show/e51fc19939407781df5cf343750a3d1d.png"></span></strong></p>    <p> </p>    <ul>     <li>      <ul>       <li><span style="color:rgb(0,153,0)"><strong>E</strong></span><span style="color:rgb(0,153,0)"><strong>ntities</strong>:</span>APP中的业务类。</li>       <li><span style="color:rgb(0,153,0)"><strong>Use Cases</strong>:</span>负责从将Entities中的数据进行处理和包装。</li>       <li><span style="color:rgb(0,153,0)"><strong>Presenters</strong>:</span>从Use Cases获取处理好的数据,然后根据需求逻辑为UI提供合适的数据。</li>       <li><span style="color:rgb(0,153,0)"><strong>UI</strong>:</span>从Presenters获取处理好的最终数据,和用户进行直接交互。</li>      </ul> </li>    </ul>    <p>这四层设计的原则是代码调用只能从外圆向内圆扩展,内圆不能干预也不需关心外圆的功能逻辑,这符合MVP的思想,Use Cases和Presenters将Entities和UI间隔分离,从而使Entities和UI只需关心自身逻辑,数据处理完全交给其他两层。</p>    <p>这里,有些同学可能会有疑问,说好的Presenters为什么会有Use Cases出来搅局?其实这也是我选择这个工程当做示例的目的,看了好多MVP文章,都在讲Presenter如何通过接口协议和其他两层进行交互,但大都忽略了Presenter层自身的构架,因为仅仅套用MVP模式,虽然在一定程度上降低View的耦合度,但因为Presenter既要处理数据,又要结合需求控制UI交互,所以很可能出现Presenter逻辑的冗余。后文的示例工程在Presenter和Model之间包装了Use Cases,将数据逻辑处理交给UseCases从而让Presenter更专心于UI交互。</p>    <p> </p>    <p><strong>三、MVP VS MVC</strong></p>    <p>在把原本MVC模式的代码修改为MVP模式后,总结这两个模式在实际使用过程中的不同点基本上总结为两点:</p>    <p> </p>    <ul>     <li>      <ul>       <li>各个层之间通过接口协议进行沟通;</li>       <li>View和Model不再进行直接交互;</li>      </ul> </li>    </ul>    <p>详细说明请参考 <a href="/misc/goto?guid=4959671469250617399" style="font-family:'Microsoft YaHei'; font-size:18px">MVC or MVP Pattern - Whats the difference?</a></p>    <p> </p>    <p><strong>四、总结</strong></p>    <p>MVP将会为你的代码带来如下好处:</p>    <p> </p>    <ul>     <li>View和Model之间的耦合度降低,使其更关注自身业务逻辑;</li>     <li>便于单元测试;</li>     <li>代码复用率提高;</li>     <li>代码框架更适用于快速迭代开发;</li>    </ul>    <p><strong>参考资料:</strong></p>    <p><a href="/misc/goto?guid=4959671469331512962">Android上的MVP模式</a></p>    <p><a href="/misc/goto?guid=4959671469250617399">MVC or MVP Pattern - Whats the difference?</a></p>    <p><a href="/misc/goto?guid=4959671469250617399">Architecting Android...The Clean way?</a></p>    <p> </p>    <p>来自: <a href="/misc/goto?guid=4959671469431702990" rel="nofollow">http://blog.csdn.net/guxiao1201/article/details/40147209</a></p>    <p> </p>