MVP 是从经典的模式MVC演变而来,它们的基本思想有相通的地方:Controller/Presenter负责逻辑的处理,Model提供数据,View负 责显示。作为一种新的模式,MVP与MVC有着一个重大的区别:在MVP中View并不直接使用Model,它们之间的通信是通过Presenter (MVC中的Controller)来进行的,所有的交互都发生在Presenter内部,而在MVC中View会从直接Model中读取数据而不是通过 Controller。

在MVC里,View是可以直接访问Model的!从而,View里会包含Model信息,不可避免的还要包括一些业务逻辑。 在MVC模型里,更关注的Model的不变,而同时有多个对Model的不同显示,及View。所以,在MVC模型里,Model不依赖于View,但是 View是依赖于Model的。不仅如此,因为有一些业务逻辑在View里实现了,导致要更改View也是比较困难的,至少那些业务逻辑是无法重用的。

MVP如何解决MVC的问题?

在MVP里,Presenter完全把Model和View进行了分离,主要的程序逻辑在Presenter里实现。而且,Presenter与具 体的View是没有直接关联的,而是通过定义好的接口进行交互,从而使得在变更View时候可以保持Presenter的不变,即重用! 不仅如此,我们还可以编写测试用的View,模拟用户的各种操作,从而实现对Presenter的测试—而不需要使用自动化的测试工具。 我们甚至可以在Model和View都没有完成时候,就可以通过编写Mock Object(即实现了Model和View的接口,但没有具体的内容的)来测试Presenter的逻辑。 在MVP里,应用程序的逻辑主要在Presenter来实现,其中的View是很薄的一层。因此就有人提出了Presenter First的设计模式,就是根据User Story来首先设计和开发Presenter。在这个过程中,View是很简单的,能够把信息显示清楚就可以了。在后面,根据需要再随便更改View, 而对Presenter没有任何的影响了。 如果要实现的UI比较复杂,而且相关的显示逻辑还跟Model有关系,就可以在View和Presenter之间放置一个Adapter。由这个 Adapter来访问Model和View,避免两者之间的关联。而同时,因为Adapter实现了View的接口,从而可以保证与Presenter之 间接口的不变。这样就可以保证View和Presenter之间接口的简洁,又不失去UI的灵活性。 在MVP模式里,View只应该有简单的Set/Get的方法,用户输入和设置界面显示的内容,除此就不应该有更多的内容,绝不容许直接访问Model— 这就是与MVC很大的不同之处。

MVP的优点:

1、模型与视图完全分离,我们可以修改视图而不影响模型;

2、可以更高效地使用模型,因为所有的交互都发生在一个地方——Presenter内部;

3、我们可以将一个Presenter用于多个视图,而不需要改变Presenter的逻辑。这个特性非常的有用,因为视图的变化总是比模型的变化频繁;

4、如果我们把逻辑放在Presenter中,那么我们就可以脱离用户接口来测试这些逻辑(单元测试)。

使用方法

1、建立bean

public class UserBean {

private String mFirstName;

private String mLastName;

public UserBean(String firstName, String lastName) {

this. mFirstName = firstName;

this. mLastName = lastName;

}

public String getFirstName() {

return mFirstName;

}

public String getLastName() {

return mLastName;

}

}

2、建立model接口(处理业务逻辑,这里指数据读写)

public interface IUserModel {

void setID(int id);

void setFirstName(String firstName);

void setLastName(String lastName);

int getID();

UserBean load(int id);// 通过id读取user信息,返回一个UserBean

}

3、建立view接口(更新ui中的view状态),这里列出需要操作当前view的方法

public interface IUserView {

int getID();

String getFristName();

String getLastName();

void setFirstName(String firstName);

void setLastName(String lastName);

}

4、建立presenter(主导器,通过iView和iModel接口操作model和view),activity可以把所有逻辑给presenter处理,这样Java逻辑就从手机的activity中分离出来

public class UserPresenter {

private IUserView mUserView;

private IUserModel mUserModel;

public UserPresenter(IUserView view) {

mUserView = view;

mUserModel = new UserModel();

}

public void saveUser( int id, String firstName, String lastName) {

mUserModel.setID(id);

mUserModel.setFirstName(firstName);

mUserModel.setLastName(lastName);

}

public void loadUser( int id) {

UserBean user = mUserModel.load(id);

mUserView.setFirstName(user.getFirstName()); // 通过调用IUserView的方法来更新显示

mUserView.setLastName(user.getLastName());

}

}

MVP主要解决就是把逻辑层抽出来成P层,要是遇到需求逻辑上的更改就可以只需要修改P层了或者遇到逻辑上的大概我们可以直接从写一个P也可以,很 多开发人员把所有的东西都写在了Activity/Fragment里面这样一来遇到频繁改需求或者逻辑越来越复杂的时候,Activity /Fragment里面就会出现过多的混杂逻辑导致出错,所以MVP模式对于APP来对控制逻辑和UI的解耦来说是一个不错的选择!

以上所述是小编给大家介绍的Android中mvp模式使用实例详解,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

android mvp模式例子_Android中mvp模式使用实例详解相关推荐

  1. android 中的悬浮按钮,Android 中FloatingActionButton(悬浮按钮)实例详解

    android 中floatingactionbutton(悬浮按钮)实例详解 一.介绍 这个类是继承自imageview的,所以对于这个控件我们可以使用imageview的所有属性 二.使用准备, ...

  2. android自定义圆角进度条,Android自定义进度条的圆角横向进度条实例详解

    1.本文将向你介绍自定义进度条的写法,比较简单,但还是有些知识点是需要注意的: invalidate()方法 RectF方法的应用 onMeasure方法的应用 2.原理 画3层圆角矩形,底层为黑色, ...

  3. java 静态 编译_Java中的动态和静态编译实例详解

    Java中的动态和静态编译实例详解 首先,我们来说说动态和静态编译的问题. Q: java和javascript有什么区别? 总结了一下:有以下几点吧: 1.首先从运行环境来说java代码是在JVM上 ...

  4. c语言二级指针有什么作用,C语言中二级指针的实例详解

    C语言中二级指针的实例详解 C语言中二级指针的实例详解 用图说明 示例代码: #include int main(int argc, const char * argv[]) { // int a = ...

  5. php 递归中的全局变量,PHP中递归的实现实例详解

    递归的定义 递归(http:/en.wikipedia.org/wiki/Recursive)是一种函数调用自身(直接或间接)的一种机制,这种强大的思想可以把某些复杂的概念变得极为简单.在计算机科学之 ...

  6. android相册和拍照并裁剪图片大小,Android 拍照并对照片进行裁剪和压缩实例详解...

    Android 拍照并对照片进行裁剪和压缩实例详解 本文主要介绍 Android 调用摄像头拍照并对照片进行裁剪和压缩,文中给出了主要步骤和关键代码. 调用摄像头拍照,对拍摄照片进行裁剪,代码如下. ...

  7. python decimal类型转化_python中的decimal类型转换实例详解

    [Python标准库]decimal--定点数和浮点数的数学运算 作用:使用定点数和浮点数的小数运算. Python 版本:2.4 及以后版本 decimal 模块实现了定点和浮点算术运算符,使用的是 ...

  8. python编程字典100例_python中字典(Dictionary)用法实例详解

    本文实例讲述了python中字典(Dictionary)用法.分享给大家供大家参考.具体分析如下: 字典(Dictionary)是一种映射结构的数据类型,由无序的"键-值对"组成. ...

  9. python迭代器创建序列_Python 中迭代器与生成器实例详解

    Python 中迭代器与生成器实例详解 本文通过针对不同应用场景及其解决方案的方式,总结了Python中迭代器与生成器的一些相关知识,具体如下: 1.手动遍历迭代器 应用场景:想遍历一个可迭代对象中的 ...

最新文章

  1. NBT:扩增子测序革命—用16S及18S rRNA全长进行微生物多样性研究
  2. html锚点(mao dian)--特殊的超链接
  3. Codeforces 1206
  4. 深度学习已经取得的进展
  5. Android测试写入文本Log
  6. 三星s3android wear,三星galaxy wearable下载
  7. Linux之进程通信20160720
  8. Cloudflare配置网站免费CDN加速使用教程
  9. java计算一个日子距离_java计算两地距离(公里)
  10. Android Dialog的简单说明
  11. 虚拟机系统iso镜像下载_如何下载正版系统镜像
  12. 智能仓储物流技术知识点汇总(部分)
  13. 猎豹网校 java,猎豹网校JAVA编程思想高级视频教程
  14. 光敏传感器实验报告_光敏传感器光电特性研究实验报告.docx
  15. 基于WTN6040F-8S语音芯片ic在助眠耳机产品的设计解决方案
  16. webp格式是什么?webp格式怎么打开?webp格式怎么转换gif/jpg/png等?
  17. 本地的手机号码归属地查询-oracle数据
  18. 《算法图解》-9动态规划 背包问题,行程最优化
  19. 温莎大学的计算机科学,温莎大学 University of Windsor
  20. 小常识:保险中的“保全”是什么?

热门文章

  1. 从电商营销谈SEM推广
  2. python在直方图上画折线图_python库之matplotlib的柱状图、直方图、阶梯图、折线图、饼图...
  3. poi导出excel合并单元格
  4. 用完让你跑路的Linux命令!
  5. 莫比乌斯函数、莫比乌斯反演
  6. DirectX 画三角形 透视投影
  7. golang单元测试框架GoConvey
  8. Windows VS Linux 那个好?
  9. 开一家披萨店需要多少钱,都要什么设备?【Lucy比萨】
  10. 顶底突破同花顺副图指标 波浪类指标