浅析设计模式之mvc、mvp、mvvm
mvc、mvvm、mvp是常见的设计模式,也是常见的设计思想,现对它们进行简要的归纳总结
三种模式的介绍
1.MVC:经典设计模式
- View 传送指令到 Controller(控制器)
- Controller 完成业务逻辑后,要求 Model 改变状态
- Model 将新的数据发送到 View,用户得到反馈,所有通信都是单向的
2.MVP:MVP 模式将 Controller 改名为 Presenter,同时改变了通信方向。
- 各部分之间的通信,都是双向的。
- View 与 Model 不发生联系,都通过 Presenter 传递。
- View 非常薄,不部署任何业务逻辑,称为"被动视图"(Passive View),即没有任何主动性,而 Presenter非常厚,所有逻辑都部署在那里。
3.MVVM
MVVM 模式将 Presenter 改名为 ViewModel,基本上与 MVP 模式完全一致。
唯一的区别是,它采用双向绑定(data-binding):View的变动,自动反映在 ViewModel,反之亦然。
这里面使用的设计模式有:观察者模式(发布订阅模式)、代理模式、工厂模式、单例模式。
在 MVVM 中,UI 是通过数据驱动的,数据一旦改变就会相应的刷新对应的 UI,UI 如果改变,也会改变对应的数据。这种方式就可以在业务处理中只关心数据的流转,而无需直接和页面打交道。ViewModel 只关心数据和业务的处理,不关心 View 如何处理数据,在这种情况下,View 和 Model 都可以独立出来,任何一方改变了也不一定需要改变另一方,并且可以将一些可复用的逻辑放在一个 ViewModel 中,让多个 View 复用这个 ViewModel。
三种模式的区别
MVC 是世界上最低级、最原始的 UI 模式;MVC 就是在 V 上绑定 M,然后 C 负责处理界面整个提交请求,并且一遍遍地刷新整个 V。这种机制。所以 MVC 的标志是“初级、单向绑定、一遍遍刷新UI”。
MVP 则是深入到程序的“骨髓”,UI设计模板与 MVP 事件定义绑定,让程序员可以捕获这么一个组件的丰富的事件,然后在事件处理过程中又去从控件树上去直接访问其它所有控件,直接修改其属性。开发的精力很大程度上用在学习各种控件的内部机制上,学习曲线陡峭。所以MVP的标志是“复杂、事件驱动、精细到每一个控件层次”。
MVVM 则是在 MVP 上的改进,它隔离了控件操作层,UI 模板上各种控件直接跟 VM 层的属性绑定,使得 VM 属性改变时自动更新 UI 控件,反之 UI 控件的值改变时又自动更新 VM 属性。这样编程的方式就不是去一大堆控件事件处理,而是写少量的 VM 属性更改行为代码。开发精力绝大部分都放在业务与UI的绑定上,而并不需要研究控件内部机制。
总结
MVC 只是把控件跟 M 绑定,一遍遍刷新 UI。而 MVP 则是把控件跟事件单向绑定,它的假设是程序员最爱写低级的代码来操作控件。而 MVVM 则是把控件跟 VM 双向绑定,它的假设是交互界面设计时最爱写高层次一些的声明来操作用户业务行为上的变化。
三种设计模式的应用
React使用的是MVC模式。所有MVC框架都是单向数据流的。
特色:
使用 Virtual DOM
提供了响应式 (Reactive) 和组件化 (Composable) 的视图组件。
将注意力集中保持在核心库,而将其他功能如路由和全局状态管理交给相关的库。
注:react 实际上是一个“伪MVC”,它其实是 MVP 的,但是它深知 MVP 模式的弊病,它明明是基于组件并且绑定了组件的 change 事件的,但是它有使用虚拟DOM的方式来一遍遍刷新UI控件(并且为了解决性能问题,有各种负责和诡异的避免全局刷新UI树的反模式操作)。所以虽然 React 自称为 MVC模式,但是实际上它是 MVP 的变种。
JQuery 是非常经典的 MVP 编程模式
Knockout、AngularJS、Vue 等可以看作是 MVVM 模式
Angular使用的MVVM模式。当触发UI事件,ajax请求或者 timeout 延迟,会触发脏检查。这时会调用 $digest 循环遍历所有的listener里的数据,判断当前值是否和先前的值有区别,如果检测到变化的话,会调用$watch 函数,最后把所有的变化全部更新,调用apply()方法把新的数据渲染到页面上。
优点:一次检测会收集所有的数据变化,然后统一更新 UI,大大减少了操作 DOM 的次数。
缺点:只要有ui或ajax或settimeout操作时就会进行检查,且当watcher之间相互影响的时候,更会触发多次$digest循环,这样watcher一多,就会很影响性能。
注:AngularJS 其实在 MVVM 上做的不是很好,倾向于 MVP。只有 Knockout 是实现了经典的 MVVM 设计模式,而且有几个性能相关的特性(例如自动延迟 UI 刷新、自动抽稀无用的 UI 刷新操作)可以将性能提高(相对于其它许多 web 前端框架)至少几十倍。
Vue一定意义上算是React和Angular的集大成者。它吸取了MVVM的数据管理思想,同时应用了React的virtual Dom算法。它使用了双向数据绑定来满足开发的便捷,但是它不同组件之间又使用单向数据流,来保证数据的可控性。它使用了很多Angular的指令语法,但是它革新了Angular的脏数据检查机制,使用数据劫持的方法来触法数据检查机制。它借鉴了React的组件化思想,大大增加了前端工程的结构规范化。
注:Vue 内部使用了 Object.defineProperty() 来实现双向绑定,通过这个函数可以监听到 set 和 get 的事件。
浅析设计模式之mvc、mvp、mvvm的更多相关文章
- 浅析前端开发中的 MVC/MVP/MVVM 模式
MVC,MVP和MVVM都是常见的软件架构设计模式(Architectural Pattern),它通过分离关注点来改进代码的组织方式.不同于设计模式(Design Pattern),只是为了解决一类 ...
- Android App的设计架构:MVC,MVP,MVVM与架构经验谈
相关:http://www.cnblogs.com/wytiger/p/5996876.html 和MVC框架模式一样,Model模型处理数据代码不变在Android的App开发中,很多人经常会头疼于 ...
- [转]MVVM架构~mvc,mvp,mvvm大话开篇
MVP 是从经典的模式MVC演变而来,它们的基本思想有相通的地方:Controller/Presenter负责逻辑的处理,Model提供数据,View负 责显示.作为一种新的模式,MVP与MVC有着一 ...
- 前端mvc mvp mvvm 架构介绍(vue重构项目一)
首先 我们为什么重构这个项目 1:我们现有的技术是前后台不分离,页面上采用esayUI+jq构成的单页面,每个所谓的单页面都是从后台胜场的唯一Id 与前端绑定,即使你找到了那个页面元素,也找不到所在的 ...
- Android App的设计架构:MVC,MVP,MVVM与架构AAAAA
1. 架构设计的目的1.1 通过设计使程序模块化,做到模块内部的高聚合和模块之间的低耦合.1.2 这样做的好处是使得程序在开发的过程中,开发人员只需要专注于一点,提高程序开发的效率,并且更容易进行后续 ...
- MVC, MVP, MVVM比较以及区别(上)
MVC, MVP和MVVM都是用来解决界面呈现和逻辑代码分离而出现的模式.以前只是对它们有部分的了解,没有深入的研究过,对于一些里面的概念和区别也是一知半解.现在一边查资料,并结合自己的理解,来谈一下 ...
- android MVC && MVP && MVVM分析和对比
相关:http://www.cnblogs.com/wytiger/p/5305087.html 出处http://blog.csdn.net/self_study,对技术感兴趣的同鞋加群544645 ...
- MVC, MVP, MVVM比较以及区别
MVC, MVP和MVVM都是用来解决界面呈现和逻辑代码分离而出现的模式.以前只是对它们有部分的了解,没有深入的研究过,对于一些里面的概念和区别也是一知半解.现在一边查资料,并结合自己的理解,来谈一下 ...
- [1] MVC & MVP &MVVM
开发架构之MVC & MVP & MVVM
- 用户界面编程模式 MVC MVP MVVM
用户界面编程模式 MVC MVP MVVM 程序 = 数据 + 算法 数据:就是待处理的东西 算法:就是代码 涉及到人机交互的程序,不可避免涉及到界面和界面上显示的数据原始方式是界面代码和逻辑代码糅合 ...
随机推荐
- 远程桌面软件RDCMan汉化版
自己汉化的远程桌面控制软件RDCMan--Remote Desktop Connection Manager(RDCMan) v2.7 简体中文汉化版. 介绍 Remote Desktop Conne ...
- Mac系统 python2.7中安装MySQLdb
由于要在python2.7上使用到MySQLdb连接数据库,所以要安装MySQLdb,也就是MySQL-Python.安装之前已经有人告诉我,这个东西比较难装,果然我也遇到好多问题,在百度找了半天,发 ...
- .Net Core建站(1):EF Core+CodeFirst数据库生成
emmm,本来想着用Core做一个小项目玩玩的,然后肯定是要用到数据库的, 然后想,啊,要不用CodeFirst,感觉很腻害的样子,于是,一脸天真无邪的我就踏入了一个深不见底的天坑... 本来想着,应 ...
- mysql -- collection一对多查询
数据库表 角色组表: CREATE TABLE `sso_character_group` ( `group_id` ) NOT NULL AUTO_INCREMENT COMMENT '角色组ID' ...
- 对于传统scnece-classfication的分析
BoW模型最初应用于文本处理领域,用来对文档进行分类和识别.BoW 模型因为其简单有效的优点而得到了广泛的应用.其基本原理可以用以下例子来给予描述.给定两句简单的文档: 文档 1:“我喜欢跳舞,小明也 ...
- RSTP协议简介
RTSP(Real-Time Stream Protocol)协议是一个基于文本的多媒体播放控制协议,属于应用层.RTSP以客户端方式工作,对流媒体提供播放.暂停.后退.前进等操作.该标准由IETF指 ...
- a标签跳转小程序
随着小程序应用的逐步广泛,与公众号之前的协同运营越来越重要,通过公众号的各个入口为小程序导流.最近在运营中发现,大家对公众号关注后回复.关键词回复,超链接小程序的需求. 首先把小程序绑定 ...
- 《ASP.NET Core 高性能系列》ASP.NET Core的启动过程(1)
一.一切从头开始 简述:知道事情的真相就应该从头 开始,下面我们代码先行 public class Program { public static void Main(string[] args) { ...
- Linux防火墙之iptables扩展处理动作
前文我们讲了iptables的扩展匹配,一些常用的扩展模块以及它的专有选项的使用和说明,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/12285152.html ...
- ovirt kvm嵌套虚拟化
嵌 套式虚拟nested是一个可通过内核参数来启用的功能.它能够使一台虚拟机具有物理机CPU特性,支持vmx或者svm(AMD)硬件虚拟化.关于 nested的具体介绍,可以看这里 .该特性需要内核升 ...