MVP模式介绍

一、概述

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

二、MVC和MVP的区别

作为一种新的模式,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模式介绍 - 梁敬承 - 梁敬承技术笔记MVP模式介绍 - 梁敬承 - 梁敬承技术笔记

       MVP模式实现了苹果提倡的MVC模式,将Model和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。

        实现MVP时,应该由UIViewController来充当Presenter的角色,然后把UIViewController的View子类化,将View逻辑单独抽离出来管理。
四、MVP的优点

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

五、MVP的缺点

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

转自:http://baike.baidu.com/subview/7294/10754970.htm#viewPageContent

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/499953.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

eclipse mat 分析dump文件,打开文件报错,out of memeory

eclipse mat 分析dump文件,打开文件报错,out of memeory 解决: 1.打开eclipse报out of memeory通用 window-->Preferences-->java-->installed JREs-->选中-->edit--> 在default VM arguments栏中加入:-server -Xms4096m -Xmx4096m -XX:PermSize512m -XX:M…

VIPER模式介绍

一、概述VIPER模式的理念不属于MV(X)系类,其理念来自于建筑设计。建筑领域流行这样一句话,“我们虽然在营造建筑,但建筑也会重新塑造我们”。正如所有开发者最终领悟到的,这句话同样适用于构建软件。编写代码中至关重要的是&#…

mysql索引(b+tree)小记

索引:快速检索的数据结构,缺点是插入时要创建索引树,所以索引不能太多 1.hash O(1) 时间复杂度低 有冲突,不支持范围查询,不支持排序 2.二叉树BST 平衡树:O(logn) 缺点:当树不平衡时,相对于没有索引 3.红黑数 相对二叉树,相对平衡 插入逐渐增大时,也会有右倾,也不是很平衡…

强制消除Xcode警告的方法

比如我已经知道某行会报警告了,但是代码有这么写的道理,实在不想看到警告,可以用下面这个宏把这几行代码包住,就可以消除警告了。#pragma clang diagnostic push#pragma clang diagnostic ignored "-Wunused-variable"/…

springMVC 源码级别总结原理,DispatcherServlet核心方法

前言 springMVC自我总结 本次maven: <!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc --><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>4.3.…

SQLite3中的数据类型

一、概述 大多数的数据库引擎&#xff08;到现在据我们所知的除了sqlite的每个sql数据库引擎&#xff09;都使用静态的、刚性的类型&#xff0c;使用静态类型&#xff0c;数据的类型就由它的容器决定&#xff0c;这个容器是这个指被存放的特定列。 Sqlite使用一个更一般的动态类…

一个java工程师必知的安全意识(信息传输篇)

我们在遇到涉及用户密码&#xff0c;用户联系方式&#xff0c;身份证信息等敏感字段的时候&#xff0c;一般的处理方式是&#xff1a; 1.传输使用密文&#xff0c;拒绝明文传输用户密码&#xff0c;推荐明文加盐加密&#xff0c;后台再解密 比如要传输的明文是123456的明文密…

关于iOS7里的JavaScriptCore framework

在iOS7沸沸扬扬的扁平化论战之外&#xff0c;WWDC 2013还是公布了很多让开发者小兴奋的点&#xff0c;其中包括多任务加强支持background fetch和transfer&#xff0c;近场通信的AirDrop和p2p&#xff0c;以及游戏控制器和游戏中心的加强&#xff1b;当然还包括了让web开发同学…

[nginx报错]---unknown directive chunkin in /XXXXX/XXXXXX:XX的几种解决方式

问题&#xff1a; nginx报错:unknown directive “chunkin” in /XXXXX/XXXXXX:XX 解决&#xff1a; 当出现unknown directive&#xff0c;一般有个反应&#xff0c;就是nginx中&#xff0c;要么配置格式不对&#xff0c;要么多了什么东西&#xff0c;要么就是有不支持的语法…

[数据库] ------ mysql 执行计划

mysql 执行计划 简单来说&#xff0c;mysql整体架构分为三块&#xff1a;应用层&#xff0c;逻辑层&#xff0c;物理层 应用层&#xff1a;负责与客户端交互&#xff0c;建立连接&#xff0c;返回数据&#xff0c;响应请求。 逻辑层&#xff1a;负责查询处理&#xff0c;事务管…

[数据库] ------ mysql规范

mysql规范&#xff1a; mysql优化的第一步&#xff0c;就是规范&#xff0c;国有国法&#xff0c;家有家规&#xff0c;一个团队在一起开发&#xff0c;也一定要有一套明确的规范来相互制约&#xff0c;下面这些规范只是作为一个互联网行业的建议&#xff0c;我相信一个团队最…

深入浅出Fetch API

多年来&#xff0c;XMLHttpRequest一直是web开发者的亲密助手。无论是直接的&#xff0c;还是间接的&#xff0c; 当我们谈及Ajax技术的时候&#xff0c;通常意思就是基于XMLHttpRequest的Ajax&#xff0c;它是一种能够有效改进页面通信的技术。 Ajax的兴起是由于Google的Gmail…

[设计模式] ------ 策略模式

策略模式 它定义了算法家族&#xff0c;分别封装起来&#xff0c;让他们直接可以互相替换&#xff0c;此模式让算法的变化&#xff0c;不会影响到使用算法的客户 其实很简单&#xff0c;可能很多人都用到了&#xff0c;只不过还不知道这就是策略模式而已。 比如定义一个接口A…

OC语法简化

很多刚从其他编程语言转到Objective-C的同学看到长长的函数名会感到崩溃&#xff0c;这种语法让消息的传递像一个英语句子&#xff0c;大大增强了可读性。比如你想初始化一个浮点数&#xff0c;需要这么写&#xff1a; NSNumber value [NSNumber numberWithFloat:123.45f];从这…

[设计模式] ------ 简单工厂模式

简单工厂模式 不同类型下创建对应的不同的对象&#xff0c;得到不同的结果&#xff0c;就叫简单生产模式 比如 定义一个接口&#xff0c;叫A&#xff0c;里面有方法a&#xff0c;返回int类型 类B1实现A接口&#xff0c;也实现a方法&#xff0c;里面做的是加法运算 类B2实现…

Podfile语法

一、Podfile Podfile文件详细描述了一个或多个工程中targets的依赖关系。Podfile会默认创建一个隐式的目标链接到工程中用户的第一个target&#xff0c;名称为“default”。 一个Podfile可以非常简单: pod AFNetworking, ~> 1.0 也可以配置的复杂一点,如下: source https:/…

[设计模式] ------ 模板模式

模板模式 模板模式&#xff0c;定义一个操作中的算法的骨架&#xff0c;而将一些步骤延迟到子类中&#xff0c;模板方法使得子类可以不改变一个算法的结构&#xff0c;就可以重定义该算法的某些特定步骤 一般是定义一个抽象类&#xff0c;有抽象方法&#xff0c;有骨架方法&a…

获取本地沙盒文件的MIMEType

通过发送一个基于本地文件的URL请求&#xff0c;从响应对象中获取MIMEType值。代码如下&#xff1a;NSString *path [[NSBundle mainBundle] pathForResource:"测试文件"ofType:"pdf"]; //创建本地文件URL NSURL *url [NSURL fileURLWithPath:path]; //创…

第19章总结

一.Java绘图类 1.Graphics类 Graphics类是所有图形上下文的抽象基类&#xff0c;它允许应用程序在组件以及闭屏图像上进行绘制。Graphics类封装了Java支持的基本绘图操作所需的状态信息&#xff0c;主要包括颜色、字体、画笔、文本、图像等。 2.Graphics2D类 Graphics2…

如何写一个数据库中间件以及需要准备的知识储备

什么是数据库中间件 1.透明化使用方无感知&#xff0c;或者尽量少感知。通过现有的接入端接入已有服务 2.增量服务不改变数据库本身功能的前提下&#xff0c;提供额外的功能与服务一个原则不破坏原有逻辑&#xff0c;并且让用户基于之前的经验可以快速上手接入端协议的选择 1.…