2019独角兽企业重金招聘Python工程师标准>>>

我记得前段时间分享了一篇文章《 浅谈Andorid开发中的MVP模式》(点击可跳转),反响不错,为了进一步介绍MVVM模式,还提前分享了实现Android中MVVM模式的一个关键技术的文章《Android 数据绑定框架DataBinding,堪称解决界面逻辑的黑科技》(点击可跳转) 。如果没有看过这两篇文章的,建议先看看这两篇文章,再看下面的分享。

什么是MVVM?

MVVM是Model-View-ViewModel的简写。微软的WPF带来了新的技术体验,如Silverlight、音频、视频、3D、动画……,这导致了软件UI层更加细节化、可定制化。同时,在技术层面,WPF也带来了 诸如Binding、Dependency Property、Routed Events、Command、DataTemplate、ControlTemplate等新特性。MVVM(Model-View-ViewModel)框架的由来便是MVP(Model-View-Presenter)模式与WPF结合的应用方式时发展演变过来的一种新型架构框架。它立足于原有MVP框架并且把WPF的新特性糅合进去,以应对客户日益复杂的需求变化。

MVC和MVP,MVVM之间的关系

MVC和MVP的关系

我们都知道MVP是从经典的模式MVC演变而来,它们的基本思想有相通的地方:Controller/Presenter负责逻辑的处理,Model提供数 据,View负责显示。作为一种新的模式,MVP与MVC有着一个重大的区别:在MVP中View并不直接使用Model,它们之间的通信是通过 Presenter (MVC中的Controller)来进行的,所有的交互都发生在Presenter内部,而在MVC中View会直接从Model中读取数据而不是通过 Controller。

MVVM和MVP的关系

而 MVVM 模式将 Presenter 改名为 ViewModel,基本上与 MVP 模式完全一致。 唯一的区别是,它采用双向绑定(data-binding):View的变动,自动反映在 ViewModel,反之亦然。这样开发者就不用处理接收事件和View更新的工作,框架已经帮你做好了。

视图化解释关系

MVC架构:

View:对应于布局文件

Model:业务逻辑和实体模型

Controllor:对应于Activity

  • View可以与Model直接交互。

  • Controller是基于行为的,并且可以被多个View共享。

  • 可以负责决定显示哪个View。

MVP架构:

View: 对应于Activity,负责View的绘制以及与用户交互
Model: 依然是业务逻辑和实体模型
Presenter: 负责完成View于Model间的交互

  • View不直接与Model交互,而是通过与Presenter交互来与Model间接交互。

  • Presenter与View的交互是通过接口来进行的。

  • 通常View与Presenter是一对一的,但复杂的View可能绑定多个Presenter来处理逻辑。

MVVM架构:

Model:代表你的基本业务逻辑

View:显示内容

ViewModel:将前面两者联系在一起的对象

一个ViewModel接口提供了两个东西:动作和数据。动作改变Model的下层(click listener,监听文字改变的listener等等),而数据则是Model的内容。

去年的I/O大会上谷歌介绍了一个非常好用的新框架DataBinding,该框架可以让你将view和一个对象的对field绑定。当field更新的时候,framework将收到通知,同时view也会自动更新。其语法和使用方式和 JSP 中的 EL 表达式非常类似。

在MVVM中,ViewModel在改变内容之后通知binding framework内容发生了改变。然后framework自动更新和那些内容绑定的view。这两个组件只是通过ViewModel松耦合在一起。这种设计模式之所以好用和方便,除了明显智能化了的View之外,还方便了测试。因为ViewModel不在依赖于View了,你可以在没有View的情况下也能测试ViewModel。在合适的依赖注入的帮助下,测试就会变得非常简单。

MVVM的优点

1. 低耦合。视图(View)可以独立于Model变化和修改,一个ViewModel可以绑定到不同的"View"上,当View变化的时候Model可以不变,当Model变化的时候View也可以不变。

2. 可重用性。你可以把一些视图逻辑放在一个ViewModel里面,让很多view重用这段视图逻辑。

3. 独立开发。开发人员可以专注于业务逻辑和数据的开发(ViewModel),设计人员可以专注于页面设计。

4. 可测试。界面素来是比较难于测试的,而现在测试可以针对ViewModel来写。

具体怎么好用,怎么使用,建议参考我写的《Android 数据绑定框架DataBinding,堪称解决界面逻辑的黑科技》这篇文章。

参考文章:

《 浅谈Andorid开发中的MVP模式》(点击可跳转)

Android 数据绑定框架DataBinding,堪称解决界面逻辑的黑科技》(点击可跳转)

转载于:https://my.oschina.net/JiangTun/blog/910901

浅谈开发中的MVVM模式及与MVP和MVC的区别相关推荐

  1. 浅谈开发中常用的设计模式

    设计模式在开发中占很重要的地位.在大型项目中使用好设计模式往往会取得事半功倍的效果.本篇博客就介绍下几种在开发中常用到的设计模式. 设计原则 先看下一些约定俗成的设计原则,其实要遵守以下所有原则很难, ...

  2. 浅谈 JAVA中静态初始化块和非静态初始化块的区别

    众所周知在JAVA编程语言中有两种初始化块: 静态初始化块 非静态初始化块 他们到底有什么区别呢?今天就浅谈一下JAVA中静态初始化块和非静态初始化块的区别 静态初始化块 定义: static{} 执 ...

  3. 浅谈golang中的代理模式

    来自一个大佬的博客,建议食用 设计模式不分语言,是一种思维层面的体现,但是不能在不同语言中使用同一套实现(每种语言有不同的特性),比如go,本身是没有继承一说,但是通过结构体的组合来实现语义上的继承. ...

  4. js架构设计模式——由项目浅谈JS中MVVM模式

    1.    背景 最近项目原因使用了durandal.js和knockout.js,颇有受益.决定写一个比较浅显的总结. 之前一直在用SpringMVC框架写后台,前台是用JSP+JS+标签库,算是很 ...

  5. 由项目浅谈JS中MVVM模式

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/. 1.    背景 最近项目原因使用了durandal.js和knock ...

  6. 理解各种设计模式原则及区别丨浅谈Nginx中核心设计模式-责任链模式丨C++后端开发丨Linux服务器开发丨web服务器

    理解各种设计模式原则及区别丨浅谈Nginx中核心设计模式-责任链模式 1. 开闭.单一职责.里氏替换.接口隔离等设计原则 2. 随处可见的模板方法 3. nginx中核心设计模式 责任链模式 4. 责 ...

  7. mvvm模式和mvc的区别_Android 开发中的架构模式 -- MVC / MVP / MVVM

    预备知识 了解 Android 基本开发 看完本文可以达到什么程度 了解如何分析一个架构模式 掌握 MVC,MVP,MVVM 架构定义和实现 更多面试内容,面试专题,flutter视频 全套,音视频从 ...

  8. 浅谈安卓中的MVP模式

    端午放假,天气下雨,于是乎在家撸一下博客,本篇博客将为大家解析MVP模式在安卓中的应用. 本文将从以下几个方面对MVP模式进行讲解: 1.  MVP简介 2.  为什么使用MVP模式 3.  MVP模 ...

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

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

最新文章

  1. java 内存映射文件进程间通讯_[转]Windows环境下利用“共享内存”实现进程间通信的C/C++代码---利用CreateFileMapping和MapViewOfFile...
  2. 蓝牙模块怎么指定查询另一个蓝牙模块_蓝牙模块以IPEX端口外接天线、PCB板载天线最为常见...
  3. 【numpy求和】numpy.sum()求和
  4. mysql多地备份_mysql简单批量备份多个库
  5. linux中断底半部机制
  6. 【Scala】使用Scala语言对匿名函数、高阶函数的定义以及详细解释(代码加注解)
  7. java quartz xml_java 使用quartz 定时xml 配置 与注解 以及注意事项
  8. Settings点击Location(位置)后右上角的开关button不会消失
  9. 获取第一个子元素_Activiti 开发案例之多实例并行子流程
  10. Xml序列化和反序列化对象-使用MemoryStream-实践
  11. Linux 下mysql修改数据库存放目录方法和可能遇到的问题
  12. 《自学SpringCloud微服务架构》之第 10 篇 —— API 网关服务 SpringCloud Zuul
  13. matlab函数 kron
  14. 计算机里的文件弄不到桌面怎么办,电脑文件夹在桌面不显示怎么办
  15. Visual Studio 20052008 各个版本下载
  16. LM317,线性稳压电源总结
  17. 解决169x/hao123浏览器劫持问题
  18. 计算机桌面上的声音图标没了,Windows7旗舰版桌面音量图标消失的原因
  19. Greenplum小把戏 - ip地址表达方式转换函数
  20. 微服务 杜家豪_将“厕所革命”进行到底

热门文章

  1. 【算法系列之十】三数之和
  2. linux 商业游戏,Ubuntu下安装试玩原生Linux版商业游戏Braid
  3. 指针、引用以及const限定符、constexpr限定符
  4. 阿里Java编程规约(集合)
  5. 栈结构功能实现的伪码展示【数据结构F】
  6. android sdk 4.4.4,4.4.4 not in Android SDK manager
  7. 英语口语 week13 Monday
  8. OpenCL “速成”冲刺【第一天】
  9. 民间75个不传之密 ,医院都不知道的秘密
  10. 初探 C# GPU 通用计算技术