死磕安卓前序:MVP架构探究之旅—基础篇

前言

了解相关更多技术,可参考《我就死磕安卓了,怎么了?》,接下来谈一谈咱们来学习一下MVP的基本认识。html

你们对MVC的架构模式再熟悉不过。今天咱们就学习一下MVP架构模式。java

MVC和MVP之间的对比

mvc和MVP之间的对照

什么是MVP(Model View Presenter)模式?

  • 一、为了使得视图接口能够与模型和控制器进行交互,控制器执行一些初始化事件
  • 二、用户经过视图(用户接口)执行一些操做
  • 三、控制器处理用户行为(能够用观察着模式实现)并通知模型进行更新
  • 四、模型引起一些事件,以便将改变发告知视图
  • 五、视图处理模型变动的事件,而后显示新的模型数据
  • 六、用户接口等待用户的进一步操做

MVP的优点

  • 一、模型与视图彻底分离,咱们能够修改视图而不影响模型
  • 二、能够更高效地使用模型,由于因此的交互都发生在一个地方——Presenter内部
  • 三、咱们能够将一个Presener用于多个视图,而不须要改变Presenter的逻辑。这个特性很是的有用,由于视图的变化老是比模型的变化频繁。
  • 四、若是咱们把逻辑放在Presenter中,那么咱们就能够脱离用户接口来测试这些逻辑(单元测试)

MVP的问题

因为对视图的渲染放在了Presenter中,因此视图和Persenter的交互会过于频繁。android

还有一点你须要明白,若是Presenter过多地渲染了视图,每每会使得它与特定的视图的 联系过于紧密。一旦视图须要变动,那么 Presenter也须要变动了。好比说,本来用来呈现Html的Presenter如今也须要用于呈现Pdf了,那么视图颇有可能也须要变动。git

一个简单的登录实例

效果图:github

效果图.gif

目录结构

mpv目录结结构

mvp用例项目结构

服务器对岸用例测试LoginService

![服务器对岸用例测试LoginService
](http://upload-images.jianshu....数据库

P层

P层.png

v层

v层.png

acitivity.png

M层

M层.png

看起来要复杂的比较多。代码量也相对比较大。可是若是用到大项目中咱们就能显示出优点了。接下来进行mvp的封装。服务器

时间久了,咱们就会发现mvp会带来极大的方面:在MVP中,因为业务逻辑都在Presenter里,咱们彻底能够写一个PresenterTest的实现类继承Presenter的接口,如今只要在Activity里把Presenter的建立换成PresenterTest,就能进行单元测试了,测试完再换回来便可。万一发现还得进行测试,那就再换成PresenterTest吧。网络

总结

M、V、P三层各有什么特色。

Model层架构

这一层主要就是负责向数据源(通常为服务器/数据库,下同)发起获取数据请求,而且把获取的数据或者错误信息回调给持有的Presenter。除了发起请求功能外,通常咱们还须要一个取消请求的方法。mvc

因此Model层主要的功能是:

  1. 向数据源发起请求;
  2. 取消该请求;
  3. 通知Presenter处理结果。

Presenter层

这层主要负责通知Model层向服务器发起请求并接收Model层回调的数据或者错误信息,而且这一层还要负责把数据或者错误信息处理后回调到View层,由View层负责显示。
通常在网络请求中的错误信息分为两种,一种是网络设备的网络状态错误,没法发送请求;另一种是服务器拒绝了此次请求。因此Presenter的主要功能是:

  1. 通知Model层向服务器发起请求;
  2. 接收Model层返回的数据(服务器可能返回数据或者拒绝服务信息);
  3. 接收Model层返回的网络错误信息;
  4. 通知Model层取消此次请求;
  5. 通知View接收处理后的数据。

View层

在MVP模式中,View层是一个接口。它的首要任务是把Presenter处理后的数据传到具体的原生控件中显示,而且控制是否显示加载进度条。
因此View层的主要功能是:

  1. 显示/隐藏进度条。
  2. 接收Presenter处理后的正确数据。
  3. 接收Presenter返回的网络错误信息。
  4. 接收Presenter返回的服务器拒绝服务信息。

MVP模式的核心思想

MVP把Activity中的UI逻辑抽象成View接口,把业务逻辑抽象成Presenter接口,Model类仍是原来的Model。

在MVP模式中Activity的功能就是响应生命周期和显示界面,具体其余的工做都丢到了Presenter层中进行完成,Presenter实际上是Model层和View层的桥梁。

项目地址:

https://github.com/androidsta...

服务端测试项目地址:

http://download.csdn.net/down...

参考连接:

http://www.360doc.com/content...

遗留问题

  • 若是代码量比较多,是否考虑mvp怎么复用的,若是复用是否会增长耦合度?

总结:过多的追求模式有时候也会拔苗助长,MVC应用有时候也有太多的宽泛。

mvp参考

MVP+Dagger2+Retrofit2.0+Rxjava看这一个例子就够了

MVP+Retrofit+Rxjava实战

若是您以为颇有帮助,欢迎随时撩我。

相关文章
相关标签/搜索