浅谈开发中的MVVM模式及与MVP和MVC的区别
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的区别相关推荐
- 浅谈开发中常用的设计模式
设计模式在开发中占很重要的地位.在大型项目中使用好设计模式往往会取得事半功倍的效果.本篇博客就介绍下几种在开发中常用到的设计模式. 设计原则 先看下一些约定俗成的设计原则,其实要遵守以下所有原则很难, ...
- 浅谈 JAVA中静态初始化块和非静态初始化块的区别
众所周知在JAVA编程语言中有两种初始化块: 静态初始化块 非静态初始化块 他们到底有什么区别呢?今天就浅谈一下JAVA中静态初始化块和非静态初始化块的区别 静态初始化块 定义: static{} 执 ...
- 浅谈golang中的代理模式
来自一个大佬的博客,建议食用 设计模式不分语言,是一种思维层面的体现,但是不能在不同语言中使用同一套实现(每种语言有不同的特性),比如go,本身是没有继承一说,但是通过结构体的组合来实现语义上的继承. ...
- js架构设计模式——由项目浅谈JS中MVVM模式
1. 背景 最近项目原因使用了durandal.js和knockout.js,颇有受益.决定写一个比较浅显的总结. 之前一直在用SpringMVC框架写后台,前台是用JSP+JS+标签库,算是很 ...
- 由项目浅谈JS中MVVM模式
文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/. 1. 背景 最近项目原因使用了durandal.js和knock ...
- 理解各种设计模式原则及区别丨浅谈Nginx中核心设计模式-责任链模式丨C++后端开发丨Linux服务器开发丨web服务器
理解各种设计模式原则及区别丨浅谈Nginx中核心设计模式-责任链模式 1. 开闭.单一职责.里氏替换.接口隔离等设计原则 2. 随处可见的模板方法 3. nginx中核心设计模式 责任链模式 4. 责 ...
- mvvm模式和mvc的区别_Android 开发中的架构模式 -- MVC / MVP / MVVM
预备知识 了解 Android 基本开发 看完本文可以达到什么程度 了解如何分析一个架构模式 掌握 MVC,MVP,MVVM 架构定义和实现 更多面试内容,面试专题,flutter视频 全套,音视频从 ...
- 浅谈安卓中的MVP模式
端午放假,天气下雨,于是乎在家撸一下博客,本篇博客将为大家解析MVP模式在安卓中的应用. 本文将从以下几个方面对MVP模式进行讲解: 1. MVP简介 2. 为什么使用MVP模式 3. MVP模 ...
- 浅谈Android中的MVP与动态代理的结合
浅谈Android中的MVP与动态代理的结合 本篇文章已授权微信公众号 guolin_blog (郭霖)独家发布 在Android开发平台上接触MVP足足算起来大概已经有一个年头左右.从最开始到现在经 ...
最新文章
- java 内存映射文件进程间通讯_[转]Windows环境下利用“共享内存”实现进程间通信的C/C++代码---利用CreateFileMapping和MapViewOfFile...
- 蓝牙模块怎么指定查询另一个蓝牙模块_蓝牙模块以IPEX端口外接天线、PCB板载天线最为常见...
- 【numpy求和】numpy.sum()求和
- mysql多地备份_mysql简单批量备份多个库
- linux中断底半部机制
- 【Scala】使用Scala语言对匿名函数、高阶函数的定义以及详细解释(代码加注解)
- java quartz xml_java 使用quartz 定时xml 配置 与注解 以及注意事项
- Settings点击Location(位置)后右上角的开关button不会消失
- 获取第一个子元素_Activiti 开发案例之多实例并行子流程
- Xml序列化和反序列化对象-使用MemoryStream-实践
- Linux 下mysql修改数据库存放目录方法和可能遇到的问题
- 《自学SpringCloud微服务架构》之第 10 篇 —— API 网关服务 SpringCloud Zuul
- matlab函数 kron
- 计算机里的文件弄不到桌面怎么办,电脑文件夹在桌面不显示怎么办
- Visual Studio 20052008 各个版本下载
- LM317,线性稳压电源总结
- 解决169x/hao123浏览器劫持问题
- 计算机桌面上的声音图标没了,Windows7旗舰版桌面音量图标消失的原因
- Greenplum小把戏 - ip地址表达方式转换函数
- 微服务 杜家豪_将“厕所革命”进行到底
热门文章
- 【算法系列之十】三数之和
- linux 商业游戏,Ubuntu下安装试玩原生Linux版商业游戏Braid
- 指针、引用以及const限定符、constexpr限定符
- 阿里Java编程规约(集合)
- 栈结构功能实现的伪码展示【数据结构F】
- android sdk 4.4.4,4.4.4 not in Android SDK manager
- 英语口语 week13 Monday
- OpenCL “速成”冲刺【第一天】
- 民间75个不传之密 ,医院都不知道的秘密
- 初探 C# GPU 通用计算技术