文章目录

  • 什么是MVP模式?
    • 图解
  • 从MVC到MVP
    • 苹果的MVC
    • 为何要从MVC到MVP?
    • MVP
  • MVP模式下的工程
  • MVP模式的优缺点

什么是MVP模式?

MVP模式是MVC模式的一个演化版本,MVP全称Model-View-Presenter。(关于MVC模式可见这篇文章)

  • Model:与MVC中的model没有太大的区别。主要提供数据的存储功能,一般都是用来封装网络获取的json数据的集合。Presenter通过调用Model进行对象交互。
  • View:这里的View与MVC中的V又有一些小差别,这个View可以是viewcontrollerview等控件。Presenter通过向View传model数据进行交互。
  • Presenter:作为Model和View的中间人,从Model层获取数据之后传给View,使得View和Model没有耦合。

图解

  • 如图中所示,MVP的 V 层是由UIViewControllerUIView 共同组成
  • View 将委托Presenter 对它自己的操作,简单来说就是Presenter发命令来控制View的交互。
  • Presenter跟Model层通信,并将数据转化成对适应UI的数据并更新View
  • View层是单一,因为它是被动接受命令,没有主动能力

Presenter 作为业务逻辑的处理者,首先要拿数据赋值给Model,所以它将可以向Model层通信。其次,UI的处理权移交给了它,所以它需要与View成通讯,发送命令更新UI。同时,UI的响应将触发业务逻辑的处理,所以View 层向Presenter层通讯,告诉他用户做了什么操作,需要你反馈对应的数据来更新UI。这样就完成了从用户交互获得交互反馈到整个业务逻辑。

从MVC到MVP

  • MVC的缺点在于并没有区分业务逻辑和业务展示, 这对单元测试很不友好。而MVP针对以上缺点做了优化, 它将业务逻辑和业务展示也做了一层隔离, 对应的就变成了MVCP. M和V功能不变, 原来的C现在只负责布局(也就可以说VC就是V), 而所有的逻辑全都转移到了P层。

苹果的MVC

  • Controller是View和Model之间的中介,这样他们就解耦了。最小的可重用单元是Controller,这对我们来说是个好消息,因为我们必须有一个来放那些不适合放入Model的复杂业务逻辑的地方。
  • 从理论上讲,它看起来很简单,但你觉得有些地方不对,对吧?你甚至听到有人说MVC全称应该改为Massive View Controller(大量的视图控制器)。此外,为View Controller减负也成为iOS开发者面临的一个重要话题。

为何要从MVC到MVP?

MVC的缺点在于并没有区分业务逻辑和业务展示, 这对单元测试很不友好。而MVP针对以上缺点做了优化, 它将业务逻辑和业务展示也做了一层隔离,
对应的就变成了MVCP. M和V功能不变, 原来的C现在只负责布局(也就可以说VC就是V), 而所有的逻辑全都转移到了P层.

MVP

  • 这看起来不正是苹果的MVC吗?是的,它的名字是MVP(Passive View variant,被动视图变体)。等等…这是不是意味着苹果的MVC实际上是MVP?不,不是这样。如果你仔细回忆一下,View是和Controller紧密耦合的,但是MVP的中介Presenter并没有对ViewController的生命周期做任何改变,因此View可以很容易的被模拟出来。在Presenter中根本没有和布局有关的代码,但是它却负责更新View的数据和状态。
  • MVP大概就是这个样子了, 相对于MVC, 它其实只做了一件事情, 即分割业务展示和业务逻辑。 展示和逻辑分开后, 只要我们能保证V在收到P的数据更新通知后能正常刷新页面, 那么整个业务就没有问题。因为V收到的通知其实都是来自于P层的数据获取 / 更新操作, 所以我们只要保证P层的这些操作都是正常的就可以了。即我们只用测试P层的逻辑, 不必关心V层的情况。

MVP模式下的工程

如下是MVP模式下一个demo的结构

  • 其中viewController类则是UI层,Presenter向UI层发送命令,其实是发给UI层的viewController,实际上是控制器来被动的更新UI。这个不管是MVC还是MVP,View的实际控制权应该都是viewController

MVP模式的优缺点

优点:

  1. 任务均摊 :我们将最主要的任务划分到 Presenter 和 Model,而 View 的功能较少;
  2. 可测试性 : 非常好,由于一个功能简单的 View 层,所以测试大多数业务逻辑也变得简单;
  3. 易用性 : 代码量比 MVC 模式的大,但同时 MVP 的概念却非常清晰。
  4. 模型与视图完全分离,我们可以修改视图而不影响模型。
  5. 可以更高效地使用模型,因为所有的交互都发生在一个地方 —— Presenter内部。
  6. 我们可以将一个Presenter用于多个视图,而不需要改变Presenter的逻辑。这个特性非常的有用,因为视图的变化总是比模型的变化频繁。
  7. 如果我们把逻辑放在Presenter中,那么我们就可以脱离用户接口来测试这些逻辑(单元测试)。

缺点:

  • 视图和Presenter的交互会过于频繁,使得他们的联系过于紧密。也就是说,一旦视图变更了,Presenter也要变更。

【iOS】MVP模式相关推荐

  1. iOS 架构模式--解密 MVC,MVP,MVVM以及VIPER架构

    2019独角兽企业重金招聘Python工程师标准>>> 本文由CocoaChina译者lynulzy(社区ID)翻译 作者:Bohdan Orlov 原文:iOS Architect ...

  2. iOS 框架模式(简述 MVC,MVP,MVVM 和 VIPER)

    写在前面的话 最近看了一篇国外大牛写的关于 iOS 框架模式的文章,内容涉及目前 iOS 端诸多主流的框架模式,个人感觉文章写的很不错,收获匪浅,希望能够通过翻译原文的方式更好的体会一下,也分享给更多 ...

  3. iOS 框架模式(简述 MVC,MVP,MVVM 和 VIPER CDD)

    最近看了一篇国外大牛写的关于 iOS 框架模式的文章,内容涉及目前 iOS 端诸多主流的框架模式,个人感觉文章写的很不错,收获匪浅,希望能够通过翻译原文的方式更好的体会一下,也分享给更多的人参考.原文 ...

  4. iOS开发笔记--基于面向协议MVP模式下的软件设计

    传统模式下的开发 MVC MVVM 基于面向协议MVP的介绍 MVP实战开发 说在前面:  相信就算你是个iOS新手也应该听说过MVC的,MVC是构建iOS App的标准模板.随着时间的推移,在iOS ...

  5. iOS架构模式(MVC/MVCS/MVP/MVVM/VIPER)

    iOS架构模式 谈起iOS架构,也许你直接想到的就是MVC,MVVM等等.其实这是不准确的,iOS架构包含的内容有很多,而上面的这些只是iOS架构中的架构模式. 那么你在进行架构设计的时候到底是选择M ...

  6. 仅需6步,教你轻易撕掉app开发框架的神秘面纱(3):构造具有个人特色的MVP模式

    1. MVP的问题 之前我们说过MVP模式最大的问题在于:每写一个Activity/Fragment需要写4个对应的文件,对于一个简易的app框架来说太麻烦了.所以我们需要对MVP进行一定的简化. 关 ...

  7. MVP模式的相关知识

    MVP 是从经典的模式MVC演变而来,它们的基本思想有相通的地方:Controller/Presenter负责逻辑的处理,Model提供数据,View负责显示.作为一种新的模式,MVP与MVC有着一个 ...

  8. MVP模式在Android中的应用之图片展示选择功能的框架设计

    前言:虽然安卓出现的时间比其它平台软件比较晚,但是在我们的安卓开发中,一样可以使用我们所熟知的设计模式来给它一个合理.完善的结构,这样,才可以使我们在平常开发的时候减少冗余代码的发生,真正的提高效率. ...

  9. android MVP模式简介

    MVP架构略解: M--Model,业务层(主要负责具体功能实现) V--View,视图层(用作显示) P--Presenter,连接层(搭建Model层和View层通信桥梁) MVP模式下,Mode ...

最新文章

  1. 自动驾驶发展到了哪个阶段?七大应用场景走进现实
  2. apache 服务发布多个项目,只需要更改配置文件(需要设定虚拟主机)
  3. JS组件系列——开源免费图表组件:Chart.js
  4. 配置yum仓库和客户端:
  5. 360浏览器怎么添加应用 360安全浏览器应用添加教程
  6. 编程常用英语词汇 | GitHub
  7. 真实体验!我在 500 强咨询公司写代码
  8. 1,使用three20来创建tableview
  9. mysql中数据导出到json文件的读取办法:
  10. SpringBoot整合mybatis出现BindingException: Invalid bound statement (not found)问题解决
  11. Vue.js项目实战——Day(1)
  12. 荣耀热键驱动无法安装
  13. 无秘app android2.2.3.5能用么,关于“无秘”APP的竞品分析
  14. 学术-数学:费马猜想
  15. yocto系列讲解[理论篇]68 -Yocto版本信息查询稳定版本和EOL版本
  16. 加载MSCOMCTL.OCX错误处理的几个关键
  17. No.059<软考>《(高项)备考大全》【冲刺13】《软考高项极简知识点(2)》
  18. Layui hint: is not a valid module
  19. 数字计算机在线用,十进制与二进制在线转换工具
  20. bzoj 1984: 月下“毛景树” 线段树+树链剖分

热门文章

  1. 时间复杂度计算公式说明
  2. hash为什么这么快?
  3. mysql有几种登录方式_MySQL的几种登陆方式
  4. 2016年春季大学先修课考试
  5. 新学 PHP 日记。(分页查询)
  6. Connection reset by peer的常见原因及常见网络异常
  7. 前端开发——JavaScript的数据类型和引用类型
  8. python数据清洗-时间格式化
  9. Pytorch LSTM 代码解读及自定义双向 LSTM 算子
  10. 资讯|WebRTC M99 更新