MVC、MVP、MVVM的简单理解

文章脑图

文章内容

1、MVC、MVP、MVVM关系

  • 1979年,Trygve Reenskaug在一篇论文中提出MVC模型,随着组件化思想发展,诞生了我们现在常用的MVC
  • 1996年,Trygve Reenskaug又在一篇论文中,他在MVC的基础上,提出了MVP模型
  • 2005年,微软的架构师John Gossman推出了MVVM模式

2、MVC

软件由MVC的View、Controller、Model三部分组成

  • View(视图):用户界面展示和用户交互(传送指令到Controller)
  • Controller(控制器):业务逻辑处理(完成业务逻辑后,要求Model改变状态)
  • Model(模型):数据请求和存储以及处理(将新数据发送到View,改变用户界面)
  • 而且所有通信都是单向的
View 接受用户指令
Controller 接受用户指令

但是我们可以根据需求调整MVC实现方式,如下图


示例

优点:

  1. 耦合性低:模型与控制器和视图相分离,可以很容易改变应用程序的数据层和业务规则
  2. 重用性高:模型与控制器和视图相分离,最大化的进行代码重用
  3. 拓展性高:无论想增加模块或修改业务,只需增加或修改相应的MVC,技术含量降低
  4. 可维护性高:模型与控制器和视图相分离,降低相互影响程度,易于维护

缺点:

  1. 不适合小型项目:MVC之间关联性强,没有做到独立重用
  2. 复杂性高:遵循MVC设计会增加结构的复杂性,并可能产生过多的更新操作,降低运行效率
  3. 耦合性高:模型与控制器和视图虽然相分离,但MVC之间关联性太强,阻碍了独立重用
  4. 损害操作性能:模型操作接口不同,视图可能要多次调用才能获得足够显示数据。对未变化数据进行不必要的频繁访问

3、MVP

软件由MVP的View、Presenter、Model三部分组成,由MVC改变Controller层含义和改变通信方向演变而来

  • View(视图):用户界面展示和用户交互(传送指令到Presenter,展示Presenter需要的相应界面)
  • Presenter(表示器):业务逻辑处理,同时也是View和Model的桥梁(中间人)(获取Model数据处理并返回给View,根据数据处理View的展示)
  • Model(模型):数据获取和存储以及处理(通过接口将数据返回给Presenter层)
  • View与Model不发生联系,都通过Presenter传递
  • View非常薄,不部署任何业务逻辑,称为"被动视图"(Passive View),即没有任何主动性,而Presenter非常厚,所有逻辑都部署在那里
MVP

优点:

  1. 耦合性低:实现了Model和View真正的完全分离,可以修改View而不影响Modle
  2. 复用性高:实现了Model和View真正的完全分离,最大化的进行代码重用
  3. 职责明确、层次清晰:只需定义好View与Presenter的接口,即可实现UI与业务逻辑独立开发,可由不同的开发团队分别实现
  4. 可维护性高:业务逻辑只在Presenter中进行维护,接口请求及缓存策略只在Model中进行维护,遵循了单一职责类的设计原则,提升了代码的可维护性
  5. 可测试:业务逻辑都集中在Presenter,那么我们就可以脱离用户接口来测试这些业务逻辑(单元测试)

缺点:

  1. V和P交互频繁:由于对视图的渲染放在了Presenter中,所以视图和Presenter的交互会过于频繁
  2. Presenter维护困难:Presenter中除了应用逻辑以外,还有大量的View->Model,Model->View的手动同步逻辑,造成Presenter比较笨重,维护起来会比较困难。
  3. 关联性高:Presenter过多地渲染了视图,往往会使得它与特定的视图的联系过于紧密。一旦视图需要变更,那么Presenter也需要变更了。
  4. 额外的代码复杂度及学习成本

4、MVVM

软件由MVP的View、ViewModel、Model三部分组成,由MVC改变Controller层含义和改变通信方向演变而来,和MVP一样
MVVM(Model-View-ViewModel)框架的由来便是MVP(Model-View-Presenter)模式与WPF结合的应用方式时发展演变过来的一种新型架构框架。它立足于原有MVP框架并且把WPF的新特性糅合进去,以应对客户日益复杂的需求变化。

【视图模型】MVVM模式的核心,它是连接View和Model的桥梁。它有两个方向:一是将【模型】转化成【视图】,即将后端传递的数据转化成所看到的页面。实现的方式是:数据绑定。二是将【视图】转化成【模型】,即将所看到的页面转化成后端的数据。实现的方式是:DOM 事件监听。这两个方向都实现的,我们称之为数据的双向绑定。

在MVVM的框架下视图和模型是不能直接通信的。它们通过ViewModel来通信,ViewModel通常要实现一个observer观察者,当数据发生变化,ViewModel能够监听到数据的这种变化,然后通知到对应的视图做自动更新,而当用户操作视图,ViewModel也能监听到视图的变化,然后通知数据做改动,这实际上就实现了数据的双向绑定。并且MVVM中的View和ViewModel可以互相通信。

MVVM

优点:

  1. 低耦合:视图(View)可以独立于Model变化和修改,一个ViewModel可以绑定到不同的"View"上,当View变化的时候Model可以不变,当Model变化的时候View也可以不变。
  2. 复用性高:你可以把一些视图逻辑放在一个ViewModel里面,让很多view重用这段视图逻辑。
  3. 独立开发:开发人员可以专注于业务逻辑和数据的开发(ViewModel),设计人员可以专注于页面设计,使用Expression Blend可以很容易设计界面并生成xaml代码。
  4. 可测试:界面素来是比较难于测试的,测试可以针对ViewModel来写。
  5. 一致性:数据源和视图实现了双向绑定,很好的做到了数据的一致性

缺点:

Bug难定位:数据绑定使得Bug很难被调试。你看到界面异常了,有可能是你View的代码有Bug,也可能是Model的代码有问题
开销大:一个大的模块中,Model也会很大,虽然使用方便了也很容易保证了数据的一致性,当长期持有,不释放内存,就造成了花费更多的内存
不利于代码重用:数据双向绑定不利于代码重用。客户端开发最常用的重用是View,但是数据双向绑定技术,让你在一个View都绑定了一个Model,不同模块的Model都不同,那就不能简单重用View了

MVC 与 MVP 的区别

上面在介绍MVP模式的时候也讲到了二者之间的区别。

  1. MVC 模式下 Controller 只能获取 Model 的接口,所以它没有办法控制 View 层的更新,是通过 Model 来控制 View 层的更新的。
  2. MVP 模式下,View 层向 Presenter 层暴露了接口,所以 Presenter 层可以直接操作 View 层,实现了对 Model 层和 View 层的解耦。

MVP 与 MVVM 的区别

通过上面的模型图来看,MVP 和 MVVM 模式似乎是相同的,其实不然。它们只是相似的。

  1. MVVM 模式采用了双向数据绑定。开发者只需要更改 View 层或者 Model 层中的数据值,不需要进行同步 Model 层和 View 层的操作,因为数据的同步会由 ViewModel 层自动完成。而 MVP 模式中,开发者需要进行处理接收事件和 View 更新的工作。
  2. 生命周期不同,MVP需要开发人员手动管理,容易造成内存泄漏。MVVM则由页面Lifecycle管理生命周期,并不需要开发人员手动去释放,没有内存泄露。
  3. MVVM结合jetpack,能写出更优雅代码。

5、参考

阮一峰 MVC,MVP 和 MVVM 的图示

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 225,208评论 6 524
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 96,502评论 3 405
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 172,496评论 0 370
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 61,176评论 1 302
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 70,185评论 6 401
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 53,630评论 1 316
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 41,992评论 3 431
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 40,973评论 0 280
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 47,510评论 1 325
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 39,546评论 3 347
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 41,659评论 1 355
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 37,250评论 5 351
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 42,990评论 3 340
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 33,421评论 0 25
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 34,569评论 1 277
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 50,238评论 3 382
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 46,732评论 2 366

推荐阅读更多精彩内容