简述一下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 ...
随机推荐
- SecureCRT标签显示IP地址
当使用SecureCRT连接到linux服务器后,SecureCRT的标签会随着操作目录的改变而改变,当连接多个的时候很不好区分,所以需要设置标签栏固定显示IP地址信息. options->Se ...
- STM32F0使用LL库实现Modbus通讯
在本次项目中,限于空间要求我们选用了STM32F030F4作为控制芯片.这款MCU不但封装紧凑,而且自带的Flash空间也非常有限,所以我们选择了LL库实现.本篇将说明基于LL实现USART通讯. 1 ...
- python-shutil学习
shutil:高级的 文件.文件夹.压缩包 处理模块 1. shutil.copyfileobj(fsrc, fdst[, length])(copyfileobj方法只会拷贝文件内容)将文件内容拷贝 ...
- UI---设置Activity背景为透明
1.在values下colors中设置透明颜色 <?xml version="1.0" encoding="utf-8"?> <resourc ...
- buaaoo_second_improvement
你不优化,我不优化,那大家就都是满分啦 (一)写在最前 电梯问题由于和实际关联比较紧密,所以实际上可以操作的空间比较多. 但第二单元的电梯,需要实现捎带:第三单元的电梯,需要实现楼层限制.人数限制.三 ...
- IntelliJ IDEA添加JUnit单元测试
使用idea IDE 进行单元测试,首先需要安装JUnit 插件. 1.安装JUnit插件步骤 File-->settings-->Plguins-->Browse reposito ...
- 杂记:腾讯暑期实习 Web 后端开发面试经历
今天面试(一面)腾讯暑期实习 Web 后端开发,一言难尽. 第一部分,常规的自我介绍. 介绍完,面试官问我对人工智能有什么理解?深度学习和机器学习的区别?对调参有什么见解?语音识别中怎样运用了机器学习 ...
- unity 时间转换方式
第一种 计时器的写法 带有调用系统时间 using System; using System.Collections; using System.Collections.Generic; using ...
- RabbitMQ原理图
一.RabbitMQ 原理图 二.Rabbit 交换器讲解 1 Direct 交换器(发布与订阅 完全匹配) 1.2搭建环境 1 ...
- Tomcat配置https后,并发较大时,频繁超时情况。
tomcat配置ssl后,出现频繁的访问超时情况. 通过脚本(感谢UCloud的技术支持 金晓帆-): netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a i ...