【iOS】MVP模式
文章目录
- 什么是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可以是
viewcontroller
、view
等控件。Presenter通过向View传model数据进行交互。 - Presenter:作为Model和View的中间人,从Model层获取数据之后传给View,使得View和Model没有耦合。
图解
- 如图中所示,MVP的 V 层是由
UIViewController
和UIView
共同组成 - 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模式的优缺点
优点:
- 任务均摊 :我们将最主要的任务划分到 Presenter 和 Model,而 View 的功能较少;
- 可测试性 : 非常好,由于一个功能简单的 View 层,所以测试大多数业务逻辑也变得简单;
- 易用性 : 代码量比 MVC 模式的大,但同时 MVP 的概念却非常清晰。
- 模型与视图完全分离,我们可以修改视图而不影响模型。
- 可以更高效地使用模型,因为所有的交互都发生在一个地方 —— Presenter内部。
- 我们可以将一个Presenter用于多个视图,而不需要改变Presenter的逻辑。这个特性非常的有用,因为视图的变化总是比模型的变化频繁。
- 如果我们把逻辑放在Presenter中,那么我们就可以脱离用户接口来测试这些逻辑(单元测试)。
缺点:
- 视图和Presenter的交互会过于频繁,使得他们的联系过于紧密。也就是说,一旦视图变更了,Presenter也要变更。
【iOS】MVP模式相关推荐
- iOS 架构模式--解密 MVC,MVP,MVVM以及VIPER架构
2019独角兽企业重金招聘Python工程师标准>>> 本文由CocoaChina译者lynulzy(社区ID)翻译 作者:Bohdan Orlov 原文:iOS Architect ...
- iOS 框架模式(简述 MVC,MVP,MVVM 和 VIPER)
写在前面的话 最近看了一篇国外大牛写的关于 iOS 框架模式的文章,内容涉及目前 iOS 端诸多主流的框架模式,个人感觉文章写的很不错,收获匪浅,希望能够通过翻译原文的方式更好的体会一下,也分享给更多 ...
- iOS 框架模式(简述 MVC,MVP,MVVM 和 VIPER CDD)
最近看了一篇国外大牛写的关于 iOS 框架模式的文章,内容涉及目前 iOS 端诸多主流的框架模式,个人感觉文章写的很不错,收获匪浅,希望能够通过翻译原文的方式更好的体会一下,也分享给更多的人参考.原文 ...
- iOS开发笔记--基于面向协议MVP模式下的软件设计
传统模式下的开发 MVC MVVM 基于面向协议MVP的介绍 MVP实战开发 说在前面: 相信就算你是个iOS新手也应该听说过MVC的,MVC是构建iOS App的标准模板.随着时间的推移,在iOS ...
- iOS架构模式(MVC/MVCS/MVP/MVVM/VIPER)
iOS架构模式 谈起iOS架构,也许你直接想到的就是MVC,MVVM等等.其实这是不准确的,iOS架构包含的内容有很多,而上面的这些只是iOS架构中的架构模式. 那么你在进行架构设计的时候到底是选择M ...
- 仅需6步,教你轻易撕掉app开发框架的神秘面纱(3):构造具有个人特色的MVP模式
1. MVP的问题 之前我们说过MVP模式最大的问题在于:每写一个Activity/Fragment需要写4个对应的文件,对于一个简易的app框架来说太麻烦了.所以我们需要对MVP进行一定的简化. 关 ...
- MVP模式的相关知识
MVP 是从经典的模式MVC演变而来,它们的基本思想有相通的地方:Controller/Presenter负责逻辑的处理,Model提供数据,View负责显示.作为一种新的模式,MVP与MVC有着一个 ...
- MVP模式在Android中的应用之图片展示选择功能的框架设计
前言:虽然安卓出现的时间比其它平台软件比较晚,但是在我们的安卓开发中,一样可以使用我们所熟知的设计模式来给它一个合理.完善的结构,这样,才可以使我们在平常开发的时候减少冗余代码的发生,真正的提高效率. ...
- android MVP模式简介
MVP架构略解: M--Model,业务层(主要负责具体功能实现) V--View,视图层(用作显示) P--Presenter,连接层(搭建Model层和View层通信桥梁) MVP模式下,Mode ...
最新文章
- 自动驾驶发展到了哪个阶段?七大应用场景走进现实
- apache 服务发布多个项目,只需要更改配置文件(需要设定虚拟主机)
- JS组件系列——开源免费图表组件:Chart.js
- 配置yum仓库和客户端:
- 360浏览器怎么添加应用 360安全浏览器应用添加教程
- 编程常用英语词汇 | GitHub
- 真实体验!我在 500 强咨询公司写代码
- 1,使用three20来创建tableview
- mysql中数据导出到json文件的读取办法:
- SpringBoot整合mybatis出现BindingException: Invalid bound statement (not found)问题解决
- Vue.js项目实战——Day(1)
- 荣耀热键驱动无法安装
- 无秘app android2.2.3.5能用么,关于“无秘”APP的竞品分析
- 学术-数学:费马猜想
- yocto系列讲解[理论篇]68 -Yocto版本信息查询稳定版本和EOL版本
- 加载MSCOMCTL.OCX错误处理的几个关键
- No.059<软考>《(高项)备考大全》【冲刺13】《软考高项极简知识点(2)》
- Layui hint: is not a valid module
- 数字计算机在线用,十进制与二进制在线转换工具
- bzoj 1984: 月下“毛景树” 线段树+树链剖分