简述一下MVC和MVVM
一. MVC
我们先来了解一下什么是MVC。
MVC:分别所指Model、View、Controller。 MVC为标准的设计模式,是官方推荐的权威的规范模式。
- 视图(View):用户交互界面。
- 控制器(Controller):调节Modle和View的交互。
- 模型(Model):业务逻辑模型(并非数据模型)
注意:这里大家容易误解Model,可能通常大家模型对象感觉非常的简单,就只是做数据模型,使Model的量级特别的轻,这样就加重了Controller对业务逻辑的处理,加重了Controller的量级。
而根据Apple的文档,model应包括数据和操作数据的业务逻辑。所以在我们在写Model部分的时候一定要注意,不是每个Controller只能对应一个Model,减少在Controller的业务逻辑,加重Model的量级。

如图所示,这是一个基本的MVC模式示意图。在MVC1中,Controller和其他部分之间的通信都是双向的。而View和model之间没有任何通信关系。
但是很多小伙伴可能都觉得这是个啥?才特么不是这样的。
如果大家有这样的感觉,那么你多少是有一些写代码的经验的。
举个小例子:
大家在开发的过程中,经常会自定义Cell,通过网络请求的数据,转换为数据模型,将数据模型传递给Cell,Cell在根据模型的内容对自身的控件内容做填充。
就这样一个简单的例子,我们就发现,Cell需要引用并调用Model,那么上图就不符合我们对MVC的理解。
上图为典型的MVC的理念,然而,MVC架构理念已经不能满足于当下的iOS开发。
尽管从技术上看View 和 Controller 是相互独立的,但事实上它们几乎总是结对出现,一个View只能与一个 Controller 进行匹配,反之亦然。但是在实际开发中,我们需要采取更为灵活的方式。
于是现在较为主流的"MVVM",应运而生了。
二. MVVM
我们先来了解一下什么是MVVM。
MVVM:分别所指Model、View | Controller、ViewModel。
在MVVM中,view 和 view controller结合在一起,我们把它们看做一个部分。
- 视图(View | Controller):调用ViewModel的方法并响应变化。
- 视图模型(ViewModel):业务逻辑。
模型(Model):数据模型
在MVVM 中,view 和 view controller正式联系在一起,我们把它们视为一个组件
如图所示,这是一个基本的MVVM模式示意图。从图中我们可以得知
*ViewModel和Model之间的通信是双向的。
*View和ViewController都不能直接引用Model,而是引用视图模型ViewModel
ViewModel用来放置用户交互验证逻辑;视图显示逻辑;发起网络请求和其他代码。
注意: 使用MVVM会一定程度的增加程序的代码量,但总体上减少了代码的复杂性,并能很好的减轻Controller的量级。View引用ViewModel,但反过来不行,任何视图本身的引用都不应该放在viewModel中。ViewController尽量不涉及业务逻辑,让ViewModel去做这些事情。ViewModel应避免过于臃肿,否则重蹈Controller的“覆辙”,变得更难以维护。
三. 总结
优点:MVC
- 易懂: 简单易懂,我想用这四个字来形容
MVC在合适不过了。 - 层次分明: 共三个部分,各自完成各自的内容,在有Controller将大家协调在一起。
弊端:MVC
- 量级重 :
ViewController处理过多的业务逻辑如协调模型和视图之间的所有交互,导致量级重,维护成本很高。 - 过轻的
Model对象:在实践中往往大家都把Model的量级设计的非常轻,总容易当做数据模型来对待。
至于很开发者所说的无法添加的网络逻辑,我个人认为完全可以设计添加到Model中。但要注意根据需求来选择“同步或异步”。
优点: MVVM
- 低耦合:
View可以独立于Model变化和修改,一个ViewModel可以绑定到不同的View 上。 - 可重用性: 可以把一些视图逻辑放在一个
ViewModel里面,让很多View重用这段视图逻辑。
弊端:MVVM
- 数据绑定后使得
Bug很难被调试。 - 数据绑定和数据转化需要
花费更多的内存成本。
个人见解
我们开发者不应该过分的追求选择哪一种模式来开发,设计模式并没有好坏之分,每个模式都有各自的优缺点,需要根据我们项目架构,来选择最何时的开发设计模式。
PS:建议大家在MVC模式下,对Model模块进行设计,不是每一个Controller只能对应一个Model,要加重对Model的量级,Controller的臃肿是可以很好的优化解决的。
链接:https://www.jianshu.com/p/fd9c2c2d1feb
来源:简书
简述一下MVC和MVVM的更多相关文章
- Android App的设计架构:MVC,MVP,MVVM与架构经验谈
相关:http://www.cnblogs.com/wytiger/p/5996876.html 和MVC框架模式一样,Model模型处理数据代码不变在Android的App开发中,很多人经常会头疼于 ...
- MVC, MVP, MVVM比较以及区别(上)
MVC, MVP和MVVM都是用来解决界面呈现和逻辑代码分离而出现的模式.以前只是对它们有部分的了解,没有深入的研究过,对于一些里面的概念和区别也是一知半解.现在一边查资料,并结合自己的理解,来谈一下 ...
- android MVC && MVP && MVVM分析和对比
相关:http://www.cnblogs.com/wytiger/p/5305087.html 出处http://blog.csdn.net/self_study,对技术感兴趣的同鞋加群544645 ...
- MVC, MVP, MVVM比较以及区别
MVC, MVP和MVVM都是用来解决界面呈现和逻辑代码分离而出现的模式.以前只是对它们有部分的了解,没有深入的研究过,对于一些里面的概念和区别也是一知半解.现在一边查资料,并结合自己的理解,来谈一下 ...
- 第四十五课:MVC,MVP,MVVM的区别
前端架构从MVC到MVP,再到MVVM,它们都有不同的应用场景.但MVVM已经被证实为界面开发最好的方案了. MVP 是从经典的模式MVC演变而来,它们的基本思想有相通的地方:Controller/P ...
- Extjs6官方文档译文——应用架构简介(MVC,MVVM)
应用架构简介 Extjs 同时提供对于MVC和MVVM应用架构的支持.这两个架构方式共享某些概念,而且都旨在沿着逻辑层面划分应用程序代码.每种方法在选择如何划分应用组件上都有其各自的优势. 本指南的目 ...
- [1] MVC & MVP &MVVM
开发架构之MVC & MVP & MVVM
- 浅析前端开发中的 MVC/MVP/MVVM 模式
MVC,MVP和MVVM都是常见的软件架构设计模式(Architectural Pattern),它通过分离关注点来改进代码的组织方式.不同于设计模式(Design Pattern),只是为了解决一类 ...
- 探索从 MVC 到 MVVM + Flux 架构模式的转变
本文首发于 my blog 在业务中一般 MVVM 框架一般都会配合上数据状态库(redux, mobx 等)一起使用,本文会通过一个小 demo 来讲述为什么会引人数据状态库. 从 MVC 到 MV ...
随机推荐
- 配置ssh无密码登陆Linux
Windows下面的话需要安装git,或者其他能执行shell命令的软件 1.首先要先修改SSH的配置文件 vi /etc/ssh/sshd_config#修改配置文件 #如果被#注释了,就取消#号, ...
- Font Awesome,一套绝佳的图标字体库和CSS框架
http://fontawesome.dashgame.com/ http://www.runoob.com/font-awesome/fontawesome-tutorial.html Font A ...
- 差分线Layout的两个误区
误区一:认为差分线可以相互之间耦合,所以可以相互之间提供回流路径,不需要地作为回流路径: 其实在信号回流分析上,差分走线和普通的单端走线的机理是一致的,即高频信号总是沿着电感最小的回路进行回流.最大的 ...
- UGUI中粒子特效与UI的遮挡问题
问题背景: 在做主线任务时发现完成任务后的特效显示穿透上面的UI层,不美观,策划不乐意了,抓紧解决下 解决思路: 首先讲下影响渲染顺序的因素: 能够影响渲染顺序的因素有:1.Camera Depth ...
- java.lang.UnsatisfiedLinkError解决方法汇集(转载)
我的解决方法: 将sigar.jar拷贝到/WEB-INF/lib/下,但这个方法不知道是不是终极解决办法,暂时没问题,其他方法可参考下面. 运行JSP报表程序页面出现java.lang.Unsati ...
- eclipse 开发环境问题
1.jdk安装,环境变量设置.主要有两个: JAVA_HOME C:\Program Files\Java\jre7 JRE_HOME C:\Program Files\Java\jre7 2 ...
- 日常报错记录4:ssh工程复制粘贴顺序。
今天要复制一个项目. 久久不能如愿. web.xml里面老是有红的,比如applicationContext.xml字段. 它应该是web.xml要找它,于是,我先把applicationContex ...
- python基础day3
一.文件管理 文件管理是很多应用程序的基本功能和重要组成部分.Python可以使文件管理极其简单,特别是和其它语言相对比. 1. 读操作 1.1r模式 1.1.1读取其他路径下文件 首先在D盘创 ...
- mysql 创建存储过程 创建1000w测试数据表
存储过程:The stored procedure 结构 CREATE [DEFINER = { user | CURRENT_USER }] PROCEDURE stored_procedure_n ...
- 逆向分析一款国外Blackjack Card Counter软件并附上License生成脚本
没有学过逆向,一时兴起,搞了一下这个小软件,名为“逆向分析”,其实过程非常简单,难登大雅之堂,就当段子看吧.首先介绍一下背景吧.这是一款国外的Blackjack也就是21点算牌软件,我从来不玩牌的,机 ...
