前言

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

大家对MVC的架构模式再熟悉不过。今天我们就学习一下MVP架构模式。

MVC和MVP之间的对比

mvc和MVP之间的对照

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

  • 1、为了使得视图接口可以与模型和控制器进行交互,控制器执行一些初始化事件
  • 2、用户通过视图(用户接口)执行一些操作
  • 3、控制器处理用户行为(可以用观察着模式实现)并通知模型进行更新
  • 4、模型引发一些事件,以便将改变发告知视图
  • 5、视图处理模型变更的事件,然后显示新的模型数据
  • 6、用户接口等待用户的进一步操作

MVP的优势

  • 1、模型与视图完全分离,我们可以修改视图而不影响模型
  • 2、可以更高效地使用模型,因为所以的交互都发生在一个地方——Presenter内部
  • 3、我们可以将一个Presener用于多个视图,而不需要改变Presenter的逻辑。这个特性非常的有用,因为视图的变化总是比模型的变化频繁。
  • 4、如果我们把逻辑放在Presenter中,那么我们就可以脱离用户接口来测试这些逻辑(单元测试)

MVP的问题

由于对视图的渲染放在了Presenter中,所以视图和Persenter的交互会过于频繁。

还有一点你需要明白,如果Presenter过多地渲染了视图,往往会使得它与特定的视图的 联系过于紧密。一旦视图需要变更,那么 Presenter也需要变更了。比如说,原本用来呈现Html的Presenter现在也需要用于呈现Pdf了,那么视图很有可能也需要变更。

一个简单的登陆实例

效果图:

效果图.gif

目录结构

mpv目录结结构

mvp用例项目结构
服务器对岸用例测试LoginService

服务器对岸用例测试LoginService

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。除了发起请求功能外,一般我们还需要一个取消请求的方法。

所以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/androidstarjack/MvpSimpleStudy

服务端测试项目地址:

http://download.csdn.net/download/androidstarjack/9966557

参考链接:

http://www.360doc.com/content/13/0808/13/7427585_305589280.shtml

****遗留问题****:

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

总结:过多的追求模式有时候也会适得其反,MVC应用有时候也有太多的宽泛。

mvp参考

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

MVP+Retrofit+Rxjava实战

如果您觉得很有帮助,欢迎随时撩我。

死磕安卓前序:MVP架构探究之旅—基础篇的更多相关文章

  1. RxJava+RxAndroid+MVP入坑实践(基础篇)

    转载请注明出处:http://www.blog.csdn.net/zhyxuexijava/article/details/51597230.com 前段时间看了MVP架构和RxJava,最近也在重构 ...

  2. 打开order by的大门,一探究竟《死磕MySQL系列 十二》

    在日常开发工作中,你一定会经常遇到要根据指定字段进行排序的需求. 这时,你的SQL语句类似这样. select id,phone,code from evt_sms where phone like  ...

  3. 《死磕 Elasticsearch 方法论》:普通程序员高效精进的 10 大狠招!(完整版)

    原文:<死磕 Elasticsearch 方法论>:普通程序员高效精进的 10 大狠招!(完整版) 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链 ...

  4. 用户登录(Material Design + Data-Binding + MVP架构模式)实现

    转载请注明出处: http://www.cnblogs.com/cnwutianhao/p/6772759.html MVP架构模式 大家都不陌生,Google 也给出过相应的参考 Sample, 但 ...

  5. 【死磕 Spring】----- IOC 之解析 bean 标签:开启解析进程

    原文出自:http://cmsblogs.com import 标签解析完毕了,再看 Spring 中最复杂也是最重要的标签 bean 标签的解析过程. 在方法 parseDefaultElement ...

  6. 【死磕 Spring】----- IOC 之深入理解 Spring IoC

    在一开始学习 Spring 的时候,我们就接触 IoC 了,作为 Spring 第一个最核心的概念,我们在解读它源码之前一定需要对其有深入的认识,本篇为[死磕 Spring]系列博客的第一篇博文,主要 ...

  7. MVP之高级MVP架构封装

    MVP之高级MVP架构封装 No MVP: 我们一般会这样写: public class MainActivity extends AppCompatActivity { private EditTe ...

  8. 三个月死磕Python是种什么样的体验?

    3个月的死磕Python后,参加「 楼+ Python实战 · 第4期 」的学员们感想如何?下面带来他们的真实评价. 作为实验楼的网红课程——「 楼+ Python实战 」已经走过了第四期,经过了三个 ...

  9. 疯狂创客圈 JAVA死磕系列 总目录

    无编程不创客,无案例不学习.疯狂创客圈,一大波高手正在交流.学习中! 疯狂创客圈 Java 死磕系列: [博客园 总入口]  QQ群:104131248 [Java 聊天室] 实战从0开始,打造100 ...

随机推荐

  1. grep 打印相关行内容

    grep 打印相关行数常用参数: -r:关键字 -c:打印符合要求的行数 -i:忽略大小写 -n:输出行和行号 -v:打印不符合要求的行,即反选 -A:后跟数字(有无空格都可以),例如 -A3表示打印 ...

  2. 三层结构与MVC

    实验室学弟突然又谈到了三层结构与MVC的话题,想想还是有必要整理一下这些个基本概念,且也纠正自己之前对二者的概念混淆,乃至将其错误思想指导于开发中. 关键词:三层结构(三层架构).MVC框架(思想). ...

  3. [C++]油田(Oil Deposits)-用DFS求连通块

    [本博文非博主原创,均摘自:刘汝佳<算法竞赛入门经典>(第2版) 6.4 图] [程序代码根据书中思路,非独立实现] 例题6-12 油田(Oil Deposits,UVa572) 输入一个 ...

  4. ansible学习笔记三:playbook和roles

    参考博客: Ansible 系列之 Playbooks 剧本 -飞走不可(博客园) linux运维学习之ansible的playbook及roles的使用 - 51CTO博客 nginx 基于uwsg ...

  5. A Bayesian Approach to Deep Neural Network Adaptation with Applications to Robust Automatic Speech Recognition

    基于贝叶斯的深度神经网络自适应及其在鲁棒自动语音识别中的应用     直接贝叶斯DNN自适应 使用高斯先验对DNN进行MAP自适应 为何贝叶斯在模型自适应中很有用? 因为自适应问题可以视为后验估计问题 ...

  6. Element Select 回显

    有思考有痛点的朋友可以聊聊(要求:认真看过Element相关文档,对该场景自己有过多角度的探索) 下拉框回显的关键点:要回显的值包含于下拉列表的数组中 demo图 最近遇到一个需求抽象下:循环中下拉框 ...

  7. 推荐使用string

    C-string(char* const char*) basic_string<>特化版本:string charwstring wchar_tu16string char16_tu32 ...

  8. 小程序开发-Step1

    先申请一个小程序 https://mp.weixin.qq.com/wxopen/waregister?action=step1 根据以上链接步骤一步一步来,认识字就可以完成,没什么特殊的 申请成功之 ...

  9. 1Mybatis入门--1.1单独使用jdbc编程问题总结

    1.1.1 jdbc程序 Public static void main(String[] args) { Connection connection = null; PreparedStatemen ...

  10. Pickup Objective Actor

    在角色的头文件中,添加一个布尔变量,设为共有状态,用来判断是否携带目标物体,并暴露给蓝图,类型为仅蓝图可读 UPROPERTY(BlueprintReadOnly,Category="Gam ...