文档章节

面试之路(3)-详解MVC,MVP,MVVM

fengsehng
 fengsehng
发布于 2016/11/09 09:16
字数 995
阅读 13
收藏 0
点赞 0
评论 0

一:mvc

mvc结构:

这里写图片描述
视图(View):用户界面。
控制器(Controller):业务逻辑
模型(Model):数据保存

mvc各部分的通信方式

这里写图片描述

mvc互动模式

通过 View 接受指令,传递给 Controller。
这里写图片描述
另一种是直接通过controller接受指令。
这里写图片描述

mvc的历史

MVC 的概念最早出现在二十世纪八十年代的 施乐帕克 实验室中(对,就是那个发明图形用户界面和鼠标的实验室),当时施乐帕克为 Smalltalk 发明了这种软件设计模式。

controller层的臃肿问题

于 View 来说,你如果抽象得好,那么一个 App 的动画效果可以很方便地移植到别的 App 上。
对于 Model 来说,它其实是用来存储业务的数据的,如果做得好,它也可以方便地复用。
如果我们能够意识到 Controller 里面的代码不便于复用,我们就能知道什么代码应该写在 Controller 里面了,那就是那些不能复用的代码。

一个解决的思路

Controller 里面就只应该存放这些不能复用的代码,这些代码

在初始化时,构造相应的 View 和 Model。
监听 Model 层的事件,将 Model 层的数据传递到 View 层。
监听 View 层的事件,并且将 View 层的事件转发到 Model 层。

Controller 只有以上的这些代码,那么它的逻辑将非常简单,而且也会非常短。

controller进一步的解决方案

但是,我们却很难做到这一点,因为还是有很多逻辑我们不知道写在哪里,于是就都写到了 Controller 中了,那我们接下来就看看其它逻辑应该写在哪里。

UITableView 的 Data Source 分离到另外一个类中。
将数据获取和转换的逻辑分别到另外一个类中。
将拼装控件的逻辑,分离到另外一个类中。

具体包括一下几种解决方案:

  • 将网络请求抽象到单独的类中
  • 将界面的拼装抽象到专门的类中
  • 构造 ViewModel
    这样抽象之后,View 只接受 ViewModel,而 Controller 只需要传递 ViewModel 这么一行代码。而另外构造 ViewModel 的过程,我们就可以移动到另外的类中了。

  • 专门构造存储类

二:MVP

MVP 模式将 Controller 改名为 Presenter,同时改变了通信方向。
这里写图片描述
1. 各部分之间的通信,都是双向的。
2. View 与 Model 不发生联系,都通过 Presenter 传递。
3. View 非常薄,不部署任何业务逻辑,称为”被动视图”(Passive View),即没有任何主动性,而 Presenter非常厚,所有逻辑都部署在那里。

三:MVVM

MVVM 模式将 Presenter 改名为 ViewModel,基本上与 MVP 模式完全一致。
这里写图片描述

MVVM的历史

相对于 MVC 的历史来说,MVVM 是一个相当新的架构,MVVM 最早于 2005 年被微软的 WPF 和 Silverlight 的架构师 John Gossman 提出,并且应用在微软的软件开发中。当时 MVC 已经被提出了 20 多年了,可见两者出现的年代差别有多大。

MVVM的问题

MVVM 的作者 John Gossman 的 批评 应该是最为中肯的。John Gossman 对 MVVM 的批评主要有两点:
第一点:数据绑定使得 Bug 很难被调试。你看到界面异常了,有可能是你 View 的代码有 Bug,也可能是 Model 的代码有问题。数据绑定使得一个位置的 Bug 被快速传递到别的位置,要定位原始出问题的地方就变得不那么容易了。
第二点:对于过大的项目,数据绑定需要花费更多的内存。

本篇文章是在读唐巧和阮一峰的博客后总结成的,许多地方直接复制粘贴了(链接如下)

http://blog.devtang.com/2015/11/02/mvc-and-mvvm/?hmsr=toutiao.io&utm_medium=toutiao.io&utm_source=toutiao.io
http://www.ruanyifeng.com/blog/2015/02/mvcmvp_mvvm.html?hmsr=toutiao.io&utm_medium=toutiao.io&utm_source=toutiao.io

© 著作权归作者所有

共有 人打赏支持
fengsehng
粉丝 4
博文 284
码字总数 214494
作品 0
朝阳
程序员
Android开源架构

Android 常用三方框架的学习 Android 常用三方框架的学习 likfe/eventbus3-intellij-plugin AS 最新可用 eventbus3 插件,欢迎品尝 简单的 MVP 模型 简单的 MVP 模型 淘宝应对双 11 的技术架...

掘金官方 ⋅ 2017/12/25 ⋅ 0

[干货]2017已来,最全面试总结——这些Android面试题你一定需要

相关阅读: 吊炸天!74款APP完整源码! [干货精品,值得收藏]超全的一线互联网公司内部面试题库,有了它,妈妈再也不用担心我进不了大公司了! [干货,阅后进BAT不是梦]面试心得与总结---BA...

xhmj12 ⋅ 2017/01/25 ⋅ 0

iOS VIPER架构实践(一):从MVC到MVVM到VIPER

简介 最近半年在写app的时候,研究了一下各种iOS代码架构,最后选择了VIPER进行实践,在此对实践中遇到的各种设计问题做一番总结,并分享造出的轮子。 对代码风格和架构有兴趣的同学,肯定都...

黑超熊猫zuik ⋅ 2017/07/21 ⋅ 0

我的Android重构之旅:架构篇

EF A舞蹈服 去年10月底来到了新公司,刚开始接手 Android 项目时,发现该项目真的是一团遭,项目开发上没有任何架构可言,开发人员连简单的 MVC、MVP 都不了解,Activity 及其臃肿,业务边界...

codeGoogle ⋅ 05/31 ⋅ 0

杂七杂八——适用于WPF的设计模式

杂七杂八——适用于WPF的设计模式 小序: 当梦想突然有一天变成现实的时候,我们会有什么样的感觉?惊喜自然是少不了的。惊喜过后呢?剩下的就是要接受现实了——就像小鬼当家里的小家伙。 ...

水之真谛 ⋅ 2008/12/16 ⋅ 0

iOS开发中MVC、MVVM模式详解

iOS中的MVC(Model-View-Controller)将软件系统分为Model、View、Controller三部分 Model: 你的应用本质上是什么(但不是它的展示方式) Controller:你的Model怎样展示给用户(UI逻辑) Vi...

天机 ⋅ 2016/06/23 ⋅ 0

美团点评Android客户端融合架构演进之路

原文:美团点评Android客户端融合架构演进之路 一 背景 点评美团合并之后,业务需要整合,我们部门的几条业务需要往美团平台迁移,为了降低迁移成本,开发和维护成本,以及将来可能要做的单元...

xhmj12 ⋅ 2016/12/26 ⋅ 0

Android面试相关知识

最近面试被问到的问题,整理了一下。 1. AIDL原理 2. 跨进程通信,AIDL、Intent、Broadcast、Content Provider 3. Android设计模式 4. MVC、MVP、MVVM,Google官方开源代码 5. 事件传递机制 ...

xingjm8511 ⋅ 2016/07/18 ⋅ 0

MVP?MVC?移动开发如何选择正确的框架?

  【IT168 评论】设计模式和架构对创建一个成功可靠的应用程序至关重要,可是具备哪些特征才算得上一个好的架构呢?MVP、MVC和MVVM似乎都不错,该如何选择呢?   为什么以及如何选择正确的...

it168网站 ⋅ 2017/06/26 ⋅ 0

教你认清MVC,MVP和MVVM

相信大家对MVC,MVP和MVVM都不陌生,作为三个最耳熟能详的Android框架,它们的应用可以是非常广泛的,但是对于一些新手来说,可能对于区分它们三个都有困难,更别说在实际的项目中应用了,有...

sxl01890 ⋅ 2016/05/04 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

大数据工程师需要精通算法吗,要达到一个什么程度呢?

机器学习是人工智能的一个重要分支,而机器学习下最重要的就是算法,本文讲述归纳了入门级的几个机器学习算法,加大数据学习群:716581014一起加入AI技术大本营。 1、监督学习算法 这个算法由...

董黎明 ⋅ 30分钟前 ⋅ 0

Kylin 对维度表的的要求

1.要具有数据一致性,主键值必须是唯一的;Kylin 会进行检查,如果有两行的主键值相同则会报错。 2.维度表越小越好,因为 Kylin 会将维度表加载到内存中供查询;过大的表不适合作为维度表,默...

无精疯 ⋅ 33分钟前 ⋅ 0

58到家数据库30条军规解读

军规适用场景:并发量大、数据量大的互联网业务 军规:介绍内容 解读:讲解原因,解读比军规更重要 一、基础规范 (1)必须使用InnoDB存储引擎 解读:支持事务、行级锁、并发性能更好、CPU及...

kim_o ⋅ 37分钟前 ⋅ 0

代码注释中顺序更改 文件读写换行

`package ssh; import com.xxx.common.log.LogFactory; import com.xxx.common.log.LoggerUtil; import org.apache.commons.lang3.StringUtils; import java.io.*; public class DirErgodic ......

林伟琨 ⋅ 45分钟前 ⋅ 0

linux实用操作命令

参考 http://blog.csdn.net/qwe6112071/article/details/50806734 ls [选项] [目录名 | 列出相关目录下的所有目录和文件 -a 列出包括.a开头的隐藏文件的所有文件-A 同-a,但不列出"."和"...

简心 ⋅ 今天 ⋅ 0

preg_match处理中文符号 url编码方法

之前想过直接用符号来替换,但失败了,或者用其他方式,但有有些复杂,这个是一个新的思路,亲测可用 <?php$str='637朗逸·超速新风王(300)(白光)'; $str=iconv("UTF-8","GBK",$s...

大灰狼wow ⋅ 今天 ⋅ 0

DevOps 资讯 | PostgreSQL 的时代到来了吗 ?

PostgreSQL是对象-关系型数据库,BSD 许可证。拼读为"post-gress-Q-L"。 作者: Tony Baer 原文: Has the time finally come for PostgreSQL?(有删节) 近30年来 PostgreSQL 无疑是您从未听...

RiboseYim ⋅ 今天 ⋅ 0

github太慢

1:用浏览器访问 IPAddress.com or http://tool.chinaz.com 使用 IP Lookup 工具获得github.com和github.global.ssl.fastly.net域名的ip地址 2:/etc/hosts文件中添加如下格式(IP最好自己查一...

whoisliang ⋅ 今天 ⋅ 0

非阻塞同步之 CAS

为解决线程安全问题,互斥同步相当于以时间换空间。多线程情况下,只有一个线程可以访问同步代码。这种同步也叫阻塞同步(Blocking Synchronization). 这种同步属于一种悲观并发策略。认为只...

长安一梦 ⋅ 今天 ⋅ 0

云计算的选择悖论如何对待?

人们都希望在工作和生活中有所选择。但心理学家的调查研究表明,在多种选项中进行选择并不一定会使人们更快乐,甚至不会产生更好的决策。心理学家Barry Schwartz称之为“选择悖论”。云计算为...

linux-tao ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部