Android开发MVP模式解析
2016-06-23 20:34
239 查看
在开发Android应用时,相信很多同学遇到和我一样的情况,虽然项目刚开始构架时自认为MVC层级分的特别明确,但最终往往是一个Activity有好几百行代码,而且逻辑和UI显示完全混杂在一起,导致后续项目的维护成本巨大。一个偶然的机会看到有种MVP模式(Mode-View-Presenter)可以比MVC更好的解耦和,然后好奇的研究了下这个模式并尝试在现在项目中进行推广。下面就把自己目前学习到知识总结出来。
MVP模式将分为两篇博客进行总结:
(一)Android开发MVP模式解析
(二)Android开发MVP模式实践
一、MVP简介
我理解的MVP是由MVC优化衍生出来的一种模式,MVP将MVC中的Controller层进行了优化而生成了Presenter。Presenter单词翻译为“提出者;任命者;主持人”,Presenter层和MVC的Controller一样,负责核心逻辑,但不一样的是Presenter通过接口协议进行数据传递,并阻断了View和Model的直接联系,从而使View和Model更加专注于自身业务逻辑。
二、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模式实践中的示例将APP分为以下四层。
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不再进行直接交互;
详细说明请参考MVC
or MVP Pattern - Whats the difference?
四、总结
MVP将会为你的代码带来如下好处:
View和Model之间的耦合度降低,使其更关注自身业务逻辑;
便于单元测试;
代码复用率提高;
代码框架更适用于快速迭代开发;
MVP模式将分为两篇博客进行总结:
(一)Android开发MVP模式解析
(二)Android开发MVP模式实践
一、MVP简介
我理解的MVP是由MVC优化衍生出来的一种模式,MVP将MVC中的Controller层进行了优化而生成了Presenter。Presenter单词翻译为“提出者;任命者;主持人”,Presenter层和MVC的Controller一样,负责核心逻辑,但不一样的是Presenter通过接口协议进行数据传递,并阻断了View和Model的直接联系,从而使View和Model更加专注于自身业务逻辑。
二、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模式实践中的示例将APP分为以下四层。
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不再进行直接交互;
详细说明请参考MVC
or MVP Pattern - Whats the difference?
四、总结
MVP将会为你的代码带来如下好处:
View和Model之间的耦合度降低,使其更关注自身业务逻辑;
便于单元测试;
代码复用率提高;
代码框架更适用于快速迭代开发;
相关文章推荐
- Android_数据库操作_笔记
- 减小Apk包大小的常用方法
- Android Fragment继承问题的分析
- android (六)、Service工作原理
- android Fragment 使用
- RabbitMQ的Android端接收
- RabbitMQ的Android端接收
- Android 使用include需要注意的坑
- android wifi adb调试
- 【风马一族_Android】强制activity的横屏与纵屏
- Activity四种启动模式详解
- Exception android.content.res.Resources$NotFoundException: File res/drawable/my.xml from drawable re
- Android DBFlow 超便捷高性能ORM数据库 入门
- 检测一般的手势Detecting Common Gestures——翻译自developer.android.com Training
- Android一些Tips总结
- android studio2.0无法关联源码
- android学习9#--自定义View之绘制过程分析
- Android照片墙完整版,完美结合LruCache和DiskLruCache
- Android四大组件之BroadcastReceiver
- Android 广播接收器