当前位置: 首页 > news >正文

MVVM是什么

什么是MVVM?

MVVM是MVC的增强版,实质上和MVC没有本质区别,只是代码的位置变动而已,这是我对MVVM的定义,如果你不知道什么是MVC,请往下看。

MVC简要

如果你做过iOS开发,相信你对这几个东西一定很熟:Model、View、Controller,分别表示数据、视图、控制器。当然,其他方向的开发人员应该不也会太陌生,其实这只是一种设计思想,具体用什么语言和做什么开发并不重要。所谓MVC便是这几个单词的简写,那么它们之间是怎么工作的呢?先看下图。
 

 

这是苹果开发者文档中摘过来的图片,表明了三者之间的关系,简单描述了三者作用

Model:数据模型,用来存储数据

View:视图界面,用来展示UI界面和响应用户交互

Controller:控制器(大管家角色),监听模型数据的改变和控制视图行为、处理用户交互

他们工作和关系看起来是如此清晰,是一种非常好的设计思想,是的,首先声明MVC是一个非常好的架构思想,你必须要掌握。

MVVM简要

既然MVC这么好,那为什么还要使用MVVM?我们先来看一下MVVM是什么。

 

上图描述了MVVM一个基本结构,看到了什么,是不是发现比MVC架构中多了一个ViewModel,没错,就是这个ViewModel,他是MVVM相对于MVC改进的核心思想。在开发过程中,由于需求的变更或添加,项目的复杂度越来越高,代码量越来越大,此时我们会发现MVC维护起来有些吃力,首先被人吐槽的最多的就是MVC的简写变成了Massive-View-Controller(意为沉重的Controller)

由于Controller主要用来处理各种逻辑和数据转化,复杂业务逻辑界面的Controller非常庞大,维护困难,所以有人想到把Controller的数据和逻辑处理部分从中抽离出来,用一个专门的对象去管理,这个对象就是ViewModel,是Model和Controller之间的一座桥梁。当人们去尝试这种方式时,发现Controller中的代码变得非常少,变得易于测试和维护,只需要Controller和ViewModel做数据绑定即可,这也就催生了MVVM的热潮。

MVVM值得用么?

个人非常推荐使用,并且可以直接在你现有的MVC基础上进行扩展,我们首先来看下优缺点

优点:

        1.Controller清晰简洁: ViewModel分离了大部分Controller代码,更加清晰和容易维护。

        2.方便测试:开发中大部分Bug来至于逻辑处理,由于ViewModel分离了许多逻辑,可以对ViewModel构造单元测试。

        3.开发解耦(举两个例子):

                a.一人负责逻辑实现、另一人负责UI实现;

                b.敏捷开发时,会发经常发不是等后端做好了接口我们再去开发,不过在没有接口的情况下通常我们可以把Controller和View完成。

缺点:

        1.看起来代码会比MVC多点

        2.需要对每个Controller实现绑定,如果处理不好,反而会有一种“画虎不成反类犬”的感觉

总结

在我实际使用过程中,MVVM写出的代码量并不比MVC的少,有时反而还会多点,毕竟多了一个数据绑定过程,但逻辑会清晰很多,对于多人开发的团队,还是有不少优势的,缺点和优点相比不值一提,总之推荐使用

相关文章:

  • Redis桌面管理工具RedisDesktopManager
  • 使用Supervisor监控进程
  • 微服务-SpringCloud: 熔断保护Sentinel
  • @JsonFormat与@DateTimeFormat注解的使用
  • SpringBoot入门 -Security安全控制
  • 数据仓库建模
  • Zipkin分布式系统调用链追踪
  • 从零开始搭建Prometheus自动监控报警系统
  • 2019版本IDEA 使用mybatis插件Free Mybatis plugin
  • SpringMVC 中 @ControllerAdvice 注解的三种使用场景
  • Java 枚举
  • Zabbix 3.0 从入门到精通(zabbix使用详解)
  • Spring中IOC的优点与缺点
  • Complex类的实现
  • Java装配模式
  • php的引用
  • 【399天】跃迁之路——程序员高效学习方法论探索系列(实验阶段156-2018.03.11)...
  • Angular Elements 及其运作原理
  • angular组件开发
  • CSS 专业技巧
  • Java小白进阶笔记(3)-初级面向对象
  • k8s 面向应用开发者的基础命令
  • nodejs调试方法
  • passportjs 源码分析
  • React 快速上手 - 06 容器组件、展示组件、操作组件
  • uni-app项目数字滚动
  • vue.js框架原理浅析
  • Vue实战(四)登录/注册页的实现
  • windows下使用nginx调试简介
  • 将回调地狱按在地上摩擦的Promise
  • 微信开放平台全网发布【失败】的几点排查方法
  • 小李飞刀:SQL题目刷起来!
  • 移动互联网+智能运营体系搭建=你家有金矿啊!
  • 06-01 点餐小程序前台界面搭建
  • ​什么是bug?bug的源头在哪里?
  • # centos7下FFmpeg环境部署记录
  • #基础#使用Jupyter进行Notebook的转换 .ipynb文件导出为.md文件
  • (1)(1.11) SiK Radio v2(一)
  • (9)YOLO-Pose:使用对象关键点相似性损失增强多人姿态估计的增强版YOLO
  • (C)一些题4
  • (附源码)python旅游推荐系统 毕业设计 250623
  • (附源码)计算机毕业设计SSM智能化管理的仓库管理
  • (三)Hyperledger Fabric 1.1安装部署-chaincode测试
  • (十)c52学习之旅-定时器实验
  • (收藏)Git和Repo扫盲——如何取得Android源代码
  • (轉貼) 2008 Altera 亞洲創新大賽 台灣學生成果傲視全球 [照片花絮] (SOC) (News)
  • ./configure,make,make install的作用(转)
  • .NET 反射 Reflect
  • .NET牛人应该知道些什么(2):中级.NET开发人员
  • .NET文档生成工具ADB使用图文教程
  • .net中我喜欢的两种验证码
  • /etc/shadow字段详解
  • @param注解什么意思_9000字,通俗易懂的讲解下Java注解
  • @property @synthesize @dynamic 及相关属性作用探究
  • @RequestParam,@RequestBody和@PathVariable 区别