文档章节

聊聊MVC、MVP、MVVM吧

1
 16161
发布于 2019/12/14 10:33
字数 1508
阅读 8
收藏 0

先来介绍下本文结构:

  1. 三种框架的具体概念
  2. 在安卓开发上的写法、优缺点

1.概念

1.1 MVC

MVC模式(Model–view–controller)是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model)、视图(View)和控制器(Controller),以便于程序的分层开发。

MVC模式最早由Trygve Reenskaug在1978年提出,是施乐帕罗奥多研究中心(Xerox PARC)在20世纪80年代为程序语言Smalltalk发明的一种软件架构。——维基百科

  • Model(模型) - 定义用户界面所需要被显示的数据模型以及这个数据模型包含着相关的业务逻辑。
  • View(视图) - 呈现给用户的终端界面,主要用于模型中数据的可视化。
  • Controller(控制器) - 作用于模型和视图上。它控制数据流向模型对象,并在数据变化时更新视图。它使视图与模型分离开。

图中的两种虚线其实分别对应着Android开发过程中的MVC模式2中写法,接下来会详细介绍。

1.2 MVP

MVP模式(Model-view-presenter)可以说是MVC模式的一种变种。在MVP模式中,为了让UI层能够从逻辑层上分离下来,在UI层与逻辑层之间加了一层Presenter。而Presenter与它们之间的交互,通常以interface来规范。无论是UI开发还是数据逻辑开发,都要尊重这个契约、按照它进行设计和开发。

  • Model - 定义用户界面所需要被显示的数据模型以及这个数据模型包含着相关的业务逻辑。
  • View - 呈现给用户的终端界面,主要用于模型中数据的可视化。
  • Presenter - 包含着组件的事件处理,负责检索 Model 获取数据,和将获取的数据经过格式转换与 View 进行沟通。
1.3 MVVM

MVVM模式(Model–view–viewmodel)也是基于MVC演化而来,它主要是基于数据绑定的框架来优化MVC。MVVM也被称为model-view-binder,像ZK(Java写的一个Web应用框架)和KnockoutJS(一个JavaScript库)也是使用此模式。

MVVM由微软架构师Ken Cooper和Ted Peters开发,通过利用WPF(微软.NET图形系统)和Silverlight(WPF的互联网应用派生品)的特性来简化用户界面的事件驱动程序设计。微软的WPF和Silverlight架构师之一John Gossman于2005年在他的博客上发表了MVVM。

Model与View与上面的基本一致,ViewModel作为它们之间的桥梁,相比于MVP模式,其ViewModel可以看成是View视图的一个模型和Presenter的合体。

通过数据绑定框架来实现ViewModel和View的绑定:

  • 当View变化时会自动更新到ViewModel上。
  • 当ViewModel变化时,会自动更新View。

2.写法以及优缺点

MVC

  • Model层在安卓中通常就是我们的bean类以及数据获取相关内容。
  • View层对应我们的layout.xml布局文件以及Activity,主要因为由于Android中layout.xml功能太弱,大部分视图的操作也需要Activity处理。
  • Controller也就对应着我们的Activity。

另外在安卓中MVC主要有两种写法:

  1. Model层与View层之间没有直接交互,数据改变后先通知C层,由C层去完成视图刷新。对应MVC图中的<------
  2. Model层可直接通知View更新。对应MVC图中的<······

分别对应的缺点:

  1. 第一种由于Android中layout.xml功能太弱,大部分视图的操作也需要Activity处理。会导致Activity代码过于臃肿。
  2. 第二种写法会稍微减轻一些Activity的负担,但其会导致Model层和View层过于紧密、耦合。
  3. 两者都会导致代码难以维护,不方便测试。

优点: 容易编写,结构相对简单。


MVP

  • M:依然是数据获取和实体模型
  • V:对应xml和Activity,负责View的绘制、用户交互
  • P:负责完成View与Model间的交互,将一些业务逻辑处理写在这里,通过接口定义实现。

优点:

MVP模式减轻了Activity的负担,将业务逻辑与视图想分离,降低了耦合性,便于复用代码也便于单个模块测试。

缺点:

  • 增加了代码复杂度,对于一些简单模块而言,会让程序变得冗余。
  • MVP 架构中,Presenter 对 Activity 与 Fragment 的生命周期是无感知的,所以我们需要手动添加相应的生命周期方法,并进行特殊处理,以避免出现异常或内存泄露

MVVM:

MVVM的架构相对复杂,核心是 Lifecycle*** 组件,在此之上,Google 还开发了 DataBinding、ViewModel、LiveData 以实现完整的 MVVM 架构。

优点:

  • 方便单元测试
  • 进行绑定后,可以减少模板代码、回调接口的编写,代码更加简洁

缺点:

  • 类会增多,增加了引用包。
  • 数据双向绑定不利于代码重用。客户端开发最常用的重用是View,但是数据双向绑定技术,让你在一个View都绑定了一个model,不同模块的model都不同。那就不能简单重用View了。
  • 一个大的模块中model也会很大,当时长期持有,不释放内存就造成了花费更多的内存。

最后

今年金九银十我花一个月的时间收录整理了一套知识体系,如果有想法深入的系统化的去学习的,可以点击传送门,我会把我收录整理的资料都送给大家,帮助大家更快的进阶。

© 著作权归作者所有

1
粉丝 0
博文 64
码字总数 160755
作品 0
长春
私信 提问
iOS架构设计勘误

镇楼.png 原文链接:https://medium.com/ios-os-x-development/ios-architecture-patterns-ecba4c38de52 一.前言 之前一直只是知道MVC/MVP/MVVM/VIPER这几个架构设计. 而且在实际工作中也都是...

Sunxxxxx丶
2017/12/05
0
0
细说Android框架设计三剑客MVC、MVP和MVVM

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 https://blog.csdn.net/mynameishuangshuai/article/details/52808032 最近几年的移动端开发...

猴子搬来的救兵Castiel
2016/10/14
0
0
教你认清MVC,MVP和MVVM

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

sxl01890
2016/05/04
157
0
浅谈MVC&变异MVC&MVP&MVVM

稍微做过几年开发的一定都听过MVC、MVP、MVVM这些架构名称吧。其实不论我们用哪一种机构模式,总会有一个地方造成臃肿,我们需要根据我们的具体业务使用更加合适的架构模式。而不能迷信哪种架...

iOS猿_员
2019/06/19
0
0
界面之下:还原真实的 MVC、MVP、MVVM 模式

前言 做客户端开发、前端开发对MVC、MVP、MVVM这些名词不了解也应该大致听过,都是为了解决图形界面应用程序复杂性管理问题而产生的应用架构模式。网上很多文章关于这方面的讨论比较杂乱,各...

星仔小号
2016/01/14
196
0

没有更多内容

加载失败,请刷新页面

加载更多

金蝶EAS DEP 服务端 脚本

1、服务端执行SQL //服务端更新单据状态var imp = JavaImporter(); imp.importPackage(Packages.com.kingdee.eas.scm.im.inv); imp.importPackage(Packages.com.kingdee.eas.srt.comm......

路过饭堂门口
27分钟前
24
0
Hive之导出文件按逗号分隔到本地文件

如下所示,默认导出的是用\t分隔的,需要使用管道符进行转换,经常使用到,记录下. List-1 hive -e "SELECT * from student" | sed 's/\t/,/g' > /tmp/student.csv...

克虏伯
36分钟前
34
0
转置/解压缩功能(zip的反转)?

我有一个2项元组的列表,我想将它们转换为2个列表,其中第一个包含每个元组中的第一个项目,第二个列表包含第二个项目。 例如: original = [('a', 1), ('b', 2), ('c', 3), ('d', 4)]# an......

技术盛宴
53分钟前
53
0
小猪o2o系统v14.0升级v14.1攻略含小猪CMS微店铺和智慧店铺及小程序百项升级

首先我们要注意升级前的以下几个内容: 即 对环境的要求 网站需求PHP7.1 MYSQL5.1以上 Sw解密组件 解密组件在swoole-loader内 解压缩网站包 修改Conf/db.php内数据库文件 替换数据库内xxx.com...

my_gode
今天
98
0
「干货来袭」Github最全Nodejs资源集

今天给大家分享一下Github上面最全的Nodejs资源集awesome-nodejs,该项目聚合了nodejs各类优质资源,对自立于全栈开发或者想了解nodejs技术栈的开发同学极有帮助,有想进一步了解nodejs的千万...

gamedilong
今天
56
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部