MVC,MVP和MVVM的区别

  • 1. MVC
  • 2. MVP
  • 3. MVVM
  • 参考材料

看了几个Android介绍MVC模块的博客,我发现他们的描述有些部分都比较不同,于是我自己也来做一个总结。

1. MVC

先说MVC,MVC全称Model View Controller,一种软件设计典范,也就是说这个东西不是Android专有,其他平台软件设计的时候也会用到这个设计方法。
但是不得不说的是,MVC的讲解会比较混乱,很有可能会出现你翻了十个博客,然后MVC的关系图会出现七八种的这种情况。

描述 Android中的对象
Model(模型) 负责提供数据模型以及处理,也负责在数据更改的时候提醒视图。 Model类
View(视图) 数据的可视化,也就是让用户看到数据。 xml文件,自定义View类,自定义Layout类
Controller(控制器) 负责处理用户交互。 Activity,Fragment


这么说肯定不太好理解,我举一个简单的例子。

前提:app中只有MainActivity一个界面,界面上就一个Textview和Button。

目标:点击button后等待3秒,生成一条随机内容的String,然后删除String中的数字和空格,最后输出到界面上,然后在5秒后,再输出一条新的String删除数字空格后到界面上。

那么在这个例子中,每个层该做什么呢?

  • Model:生成String(提供数据模型);将String进行加工,然后发给View(处理数据模型);5s后再通知一次View(数据更新后提醒)。
  • Controller:点击Button后等待3秒通知Model(处理用户交互)。
  • View:将Button和TextView封装成一个Layout或者View;显示TextView的内容(数据可视化)。

    其中MainLayout将Textview和Button封装在一起。

Button的按钮监听会不统一的可能写在View(自定义View)也可能写在Controller(Activity)中。

也有一种说法是Controller负责数据的加工处理,这种情况下String的删除数字和空格会交由Activity来做,且Controller层和Model层会变成两个相互的箭头。这个内容我会在MVP里说。

这么一举例,就可以明显的发现MVC的优点了:

  1. 逻辑分离,专事专办,视图层和业务层分离,耦合性低(一边只负责显示String,一边只负责生成和加工String)。
  2. 可维护性高(这个也是因为上一点,分离了就更好维护了)。
  3. 代码的重用性高(如果哪天别的控件需要这个String了,就可以直接调用,如果不分离的话,整段代码就要再抄一遍)。

与此同时,MVC的一些缺点就显示出来了:

  1. 中小型项目用起来太麻烦(不就一个监听事件输出String的方法吗,我一个函数就搞定了还搞这么多类?)。
  2. VC层耦合性过高,这个是特定针对Android的,因为在Android端,C层代表的是Activity/Fragment,这个是我们主要的用户交互界面,它总是会不可避免的染上一堆视图的逻辑(比如Activity/Fragment切换,显示Dialog,绑定控件)。这种情况下C层并没有完全的C,而加入了一部分V层的操作。
  3. M层的逻辑太多,M层不仅要负责数据的生成,还要负责数据的加工,更要负责视图的提醒这种情况下M层的任务太重且类型太多,就不易于维护。

2. MVP

MVP是基于MVC而生成的,所以明白了MVC,就可以容易理解MVP模式。
MVP全称Model View Presenter,当然也是设计典范。

描述 Android中的对象
Model(模型) 负责提供数据模型。 Model类
View(视图) 数据的可视化。 主要是Activity,Fragment
Presenter/Controller(都叫Presenter了,找不到中文) 负责处理用户交互和数据加工。 Presenter类/Controller类


之前MVC的关系图看的确实是有些混乱,一些指向又是实线又是虚线的,然后还弄了个三角关系。但是在MVP中,P层是完全隔断了V层和M层的联系,成为了一个中间地带。

对比一下MVC层,再看看MVP层中做了哪些不同的事吧,用一个具体的例子来举例(其实就是MVC的例子,防止翻回去看,在下面复制了一遍)。

前提:app中只有MainActivity一个界面,界面上就一个Textview和Button。

目标:点击button后等待3秒,生成一条随机内容的String,然后删除String中的数字和空格,最后输出到界面上,然后在5秒后,再输出一条新的String删除数字空格后到界面上。

那么在这个例子中,每个层该做什么呢?

  • Model:生成String后发给Presenter(提供数据模型)。
  • View:显示TextView的内容(数据可视化);点击Button后报告给Presenter(也就是Button的监听)。
  • Presenter/Controller:收到等待3秒通知Model,再等待5秒后再通知Model(处理用户交互);String的删除数字和空格(数据加工);加工后的数据发给View。

你会发现,我上面MVC所说的Controller层负责数据的加工,其实和MVP的内容很相像,其实就差不多是MVP那意思了。

那么对比MVC,MVP做了哪些改进:

  1. View层终于从高耦合中解放了,Activity这次只负责视图的处理部分,所有的视图都归他管,他不用再去处理业务逻辑了。
  2. Model也从多种类型的复杂任务中解放了,这次它只负责提供数据模型(在项目中一般是数据库或者网络),如果哪天需求变成了删除String中的字符,Model层也完全不用动,因为那个任务现在归Presenter管。
  3. View层和Model层完全分离,会出现有时候只要改动Model层而完全不用修改View层的情况,反过来也有,维护起来就更方便了。

但是MVP模式也依旧有一些缺点:

  1. 中小型项目不适用,这个是继承自MVC模式的缺点了。
  2. Presenter和View层的耦合度有点高,一般来说如果要改动View层那么很有可能Presenter层也要跟着改动。

3. MVVM

接下来就可以说MVVM的模式了,这个MVVM有说是从MVC来的,也有说是MVP来的,我这里就当做是MVP来的。
MVVM全称Model View ViewModel,这里请不要误会,虽然是MVVM,但是实际上也是三层,第三层就是VM层。

描述 Android中的对象
Model(模型) 负责提供数据模型。 Model类
View(视图) 数据的可视化。 主要是Activity,Fragment
ViewModel 负责处理用户交互和数据加工。 ViewModel类


一看之下MVVM看上去和MVP的区别不大,现在来介绍一下两者的区别。
在MVVM中,VM层取代了原先的P层,然后两者之前的两个箭头变成了一个双向箭头,这就是MVVM相对于MVP的变化。
VM层和V层在MVVM中实现了一个双向的数据绑定,在他们中间还隐藏了一个绑定器Binder。

我之前看了很多MVVM介绍的博客,他们都说到了数据绑定这个词,那么什么是数据绑定?我再举之前那个例子。

前提:app中只有MainActivity一个界面,界面上就一个Textview和Button。

目标:点击button后等待3秒,生成一条随机内容的String,然后删除String中的数字和空格,最后输出到界面上,然后在5秒后,再输出一条新的String删除数字空格后到界面上。

在之前MVP模式中,V层的任务是绑定控件和显示String的内容到TextView上。也就是说,无论如何一定会调用到textview.setText(string);这个方法对吧,但是在MVVM模式中,你可以不用再调用setText了。MVVM中只要string这个变量一更新,Textview就会自动显示更新后的值,这就是数据绑定。

了解了数据绑定后,再来看看MVVM中每个层的具体任务:

  • Model:生成String后发给Presenter(提供数据模型)。
  • View:实现绑定器,实现Button监听。
  • ViewModel:收到等待3秒通知Model,再等待5秒后再通知Model(处理用户交互);String的删除数字和空格(数据加工后会自动更新)。

    在MVVM中,View层只需要实现绑定器和监听即可,实际上的视图内容显示都由绑定器来完成(而这个绑定器对于我们而言只要设置好就行),View层的任务因此而抽象化了非常多。

那么,说了这么久绑定器绑定器的,这个绑定器又到底是个啥?
别的语言我不太清楚,但是在Android中,google公司特地的推出了一个DataBinding框架,这个东西就是我们实现绑定器的具体工具了。所以经常会看到Android MVVM的介绍博客说着说着就变成DataBinding的介绍,要注意两者是完全不同的东西,一个是设计典范,一个是工具!

关于DataBinding怎么使用,参考这篇:
Android DataBinding 从入门到进阶 - 简书
https://www.jianshu.com/p/bd9016418af2

最后再总结一下MVVM相对MVP的改进:

  1. 数据绑定让V层抽象化,代码进一步的减少,更加方便了。
  2. 相对于MVP,VM层可以一次性对应多个V层了,在MVP模式中,经常是一个页面一个Presenter,但是在MVVM中,会出现多个页面但是只有一个ViewModel的情况,这个是真的是提高了很多代码重用性。

以及MVVM的缺点:

  1. 调试变得更加困难,以前如果在V层报错的话,你会明显的看到V层的报错信息,但是在MVVM中由于是绑定器负责更新,报错后的调试就更加困难了(不好定位出错的地方,VM层报错的时候,可能是VM层出错,也可能是M层出错,你的String出错了,不知道是生成的时候出错,还是修改的时候出错)。
  2. 数据双向绑定不利于代码重用,但是这一点我存疑,因为在Android中DataBinding是可以实现单向绑定的。不过View层确实是不好代码重用了。
  3. 一个大的模块中,model也会很大,虽然使用方便了也很容易保证了数据的一致性,当长期持有,不释放内存,就造成了花费更多的内存(这个我真不懂,是我复制来的)。

参考材料

MVC 模式 | 菜鸟教程
https://www.runoob.com/design-pattern/mvc-pattern.html
MVC框架_百度百科
https://baike.baidu.com/item/MVC%E6%A1%86%E6%9E%B6/9241230?fromtitle=mvc&fromid=85990&fr=aladdin
Android App的设计架构:MVC,MVP,MVVM与架构经验谈-android,mvp,mvc 相关文章-天码营
https://www.tianmaying.com/tutorial/AndroidMVC
https://blog.csdn.net/huangliniqng/article/details/85804875

Android中MVC,MVP和MVVM的区别相关推荐

  1. Android中MVC、MVP、MVVM具体解释

    前言 今天有时间就刚好有想写关于这几个名词.对于我来说.事实上这么多名词.思想归根究竟就是要依据项目实际.人员配置来做合理优化,既不能纸上谈兵.又不能畏惧不前.那么合理分阶段架构和完好代码才是关键,本 ...

  2. 浅谈Android中的MVP与动态代理的结合

    浅谈Android中的MVP与动态代理的结合 本篇文章已授权微信公众号 guolin_blog (郭霖)独家发布 在Android开发平台上接触MVP足足算起来大概已经有一个年头左右.从最开始到现在经 ...

  3. MVC, MVP 与 MVVM

    前几天读了阮一峰老师的文章<MVC,MVP 和 MVVM 的图示>,觉得讲得十分清晰,所以在这里做一波复习和总结. MVC, MVP 与 MVVM 是三种常见的软件架构,它们之间的特点与区 ...

  4. android中MVC,MVP和MVVM三种模式详解析

    我们都知道,Android本身就采用了MVC模式,model层数据源层我们就不说了,至于view层即通过xml来体现,而 controller层的角色一般是由activity来担当的.虽然我们项目用到 ...

  5. android mvc mvp 区别,谈谈Android框架 MVC、MVP、MVVM的区别

    今天写写Android的MVC.MVP.MVVP三个框架的对比,并加深自己对这三个框架的理解. 548b9bea8dc18.gif 一 . MVC:Model-View-Controller MVC全 ...

  6. 手写Android中MVC、MVP、MVVM对比

    1. MVC.MVP.MVVM 1.1 MVC Model 模型层: 业务模型的数据与行为=数据+业务逻辑 View 展示层: 管理用户界面=组合模式的View集合 Controller: Model ...

  7. Android的MVC MVP MVVM模式

    学习Android的同学一定要了解的三种开发模式,不然自己写的项目采用的什么模式都不清楚 MVC,MVP,MVVM都是为了解决UI页面与逻辑代码分离而出现的模式,MVP和MVVM都是MVC的基础上演化 ...

  8. android 适合mvp模式,Android中的MVP:如何使Presenter层系统化?

    MVP(Model View Presenter)模式是著名的 MVC(Model View Controller)的衍生物,并且是 Android 应用程序中管理表示层的***的模式之一. 这篇文章 ...

  9. MVC,MVP与MVVM

    一.MVC是什么 1.MVC概念 MVC(Model View Controller),模型(model)-视图(view)-控制器(controller),软件框架的一种. (1)最上层view视图 ...

  10. android中的mvp模式怎么定义,详解MVP模式在Android开发中的应用

    一.MVP介绍 随着UI创建技术的功能日益增强,UI层也履行着越来越多的职责.为了更好地细分视图(View)与模型(Model)的功能,让View专注于处理数据的可视化以及与用户的交互,同时让Mode ...

最新文章

  1. win 系统配置 openal
  2. c++创建单级目录 多级目录,判断是否存在
  3. 如何在Web应用程序中使用TWAIN驱动程序的自定义功能?
  4. java intern_java String的intern方法
  5. 2020CCPC(长春) - Ragdoll(启发式合并+带权并查集)
  6. libzdb 连接mysql,数据库连接池库libzdb使用教程
  7. java中值滤波_Java实现图像中值滤波
  8. php正则表达式小括號,php使用正則表達式提取字符串中尖括號、小括號、中括號、大括號中的字符串...
  9. AngularJS开发指南10:AngularJS依赖注入的详解
  10. 【自学51单片机】1 -- 初步认识单片机及其学习方法 和 单片机基础知识介绍
  11. JAVA中 万物皆对象
  12. PAT 乙级 1055  集体照
  13. python重连wifi(windows电脑断网)
  14. 人生就是一场与自己的较量,社科院杜兰金融硕士项目引领你走得更远
  15. threejs的转场动画 (基于Tween实现)、平滑切换场景
  16. 进击的马云,失落的码农
  17. 【贪心算法】-背包问题
  18. 桌面文件丢失如何找回?这两个方法值得一试
  19. 20200413 jzoj 普及c组 Loan Repayment
  20. YT8614 QSGMII 模式网口丢包问题分析

热门文章

  1. 爬虫出现selenium.common.exceptions.NoSuchWindowException: Message: Browsing context has been discarded
  2. 立创商城PCB库使用说明
  3. [iOS]判断设备是否越狱
  4. catgroup linux_linux中/etc/group文件详解
  5. 【python入门】循环语句
  6. pandas基础用法详解
  7. 春运大幕开启 福建铁路预计发送旅客1575万人次
  8. 大白菜u盘启动盘清除系统登录密码详细教程
  9. android 环信8.0通知栏,环信客服机器人v8.0.3发布:教你快速构建知识库,精准识别访客意图...
  10. postman中 form-data、x-www-form-urlencoded、raw、binary的区别