浅谈MVC、MVP、MVVM模式
mvc的模式已经深入人心,想必大家都很熟悉,但是未必都能遵守mvc模式。我们的一个mvc项目比较简单,主要是数据库的查询。一个DBHelp类,封装了数据库的操作,然后Controller中进行中各种查询,包含分页查询。也就是说,所有的逻辑全部在Controller中完成。请问这还是mvc模式吗?
严格意义上,已经违背了mvc模式,但是从实践层面看,似乎没有什么问题,这样做简单好多。我们知道mvc把一个应用程序划分了三个层次结构。Model、View和Controller,Model代表了业务逻辑,比如说数据库的各种查询,Controller就是调用Model中的方法,然后把Model中的数据部分填充,最后选择View,把Model数据给View。
我们的Model文件夹下存放的是自定义的ViewModel,ViewModel作为view的数据源对象。这时候,我们是不是可以称为MVVMC模式呢?我们去掉C,加上数据绑定,这不就是MVVM模式吗?我觉得MVVM模式的亮点在于数据绑定,也就是View和ViewModel的绑定。有一个js叫knockout.js是一个前台的MVVM框架。WPF,也是典型的MVVM模式。
我觉得mvc模式,适合界面和逻辑都比较复杂的项目。比如我们用的webform,有些人会在页面的CodeBehind中,写入大量的代码,少则几千,多则上万。界面的逻辑与功能的逻辑的代码彻底耦合在一起。维护起来的确不容易。针对如此情况,我们用mvc是不是能好一些?无论哪一种模式,都是分层的思想,没有人能用一个方法把所有的逻辑都包含在里面。MVC、MVP、MVVM模式,它们旨在分离View和Model,避免过度耦合。MVP模式,分离的更彻底。它通过引入IView接口,在View中实现IView接口。View中可以直接调用P,而P中注入了IView,因此P可以间接地调用View,P中可以调用M,M封装了业务逻辑。这样View和Model彻底分离。这个模式好不好?就看从哪个角度说了。如果项目中,对测试要求很高的话,这个模式确实好。View和Model可以单独测试。但是这个模式实现起来有些麻烦。因此,对某些测试要求高的View和Model使用此模式应该更好一些。
MVVM模式,可以实现对Model的实时变化的监控。以及自动化测试可以基于此模式。
MVC:从View开始,用户在View上的任何操作,都可以调用Controller,Controller调用Model,然后更新View。
MVP:View和Model完全解耦
MVVM:View和Model也没有直接的关系,它和MVP有点相似。
这三个模式本质上都反映了Model和View之间的关系。传统的MVC和MVP都是Model变化,然后更新View,但是MVVM更进一步,它的View变化,导致ViewModel直接变化。这样最大的优点,就是省略了从View到ViewModel的映射。我们可以直接”忘记”View,只需要Model和ViewModel交互。毕竟View比较麻烦,它的UI控件,也就是Html控件的多样化,处理起来比较复杂。
浅谈MVC、MVP、MVVM模式的更多相关文章
- 浅谈MVC MVP MVVM
复杂的软件必须有清晰合理的架构,否则无法开发和维护. MVC(Model-View-Controller)是最常见的软件架构之一,业界有着广泛应用. 它本身很容易理解,但是要讲清楚,它与衍生的 MVP ...
- 浅谈MVC和MVVM模式
MVC I’m dating with a model… and a view, and a controller. 众所周知,MVC 是开发客户端最经典的设计模式,iOS 开发也不例外,但是 MVC ...
- 浅析前端开发中的 MVC/MVP/MVVM 模式
MVC,MVP和MVVM都是常见的软件架构设计模式(Architectural Pattern),它通过分离关注点来改进代码的组织方式.不同于设计模式(Design Pattern),只是为了解决一类 ...
- 浅谈MVC、MVVM的区别
一.概述 MVC,MVP,MVVM是三种常见的前端架构模式(Architectural Pattern),它通过分离关注点来改进代码组织方式.不同于设计模式(Design Pattern),只是为了解 ...
- 由项目浅谈JS中MVVM模式
文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/. 1. 背景 最近项目原因使用了durandal.js和knock ...
- js架构设计模式——由项目浅谈JS中MVVM模式
1. 背景 最近项目原因使用了durandal.js和knockout.js,颇有受益.决定写一个比较浅显的总结. 之前一直在用SpringMVC框架写后台,前台是用JSP+JS+标签库,算是很 ...
- mvc mvp mvvm模式的区别
mvc模式中,Model不依赖于View,但是View是依赖于Model的,m和v没有进行完全的分离,三者之间是单向的操作 mvp模式中,m和v之间的交互是双向的,m和v完全分离,m和v的交互是通过P ...
- Android MVC,MVP,MVVM模式入门——重构登陆注册功能
一 MVC模式: M:model,业务逻辑 V:view,对应布局文件 C:Controllor,对应Activity 项目框架: 代码部分: layout文件(适用于MVC和MVP两个Demo): ...
- 用户界面编程模式 MVC MVP MVVM
用户界面编程模式 MVC MVP MVVM 程序 = 数据 + 算法 数据:就是待处理的东西 算法:就是代码 涉及到人机交互的程序,不可避免涉及到界面和界面上显示的数据原始方式是界面代码和逻辑代码糅合 ...
- MVC, MVP, MVVM比较以及区别(上)
MVC, MVP和MVVM都是用来解决界面呈现和逻辑代码分离而出现的模式.以前只是对它们有部分的了解,没有深入的研究过,对于一些里面的概念和区别也是一知半解.现在一边查资料,并结合自己的理解,来谈一下 ...
随机推荐
- 【BZOJ4026】dC Loves Number Theory 分解质因数+主席树
[BZOJ4026]dC Loves Number Theory Description dC 在秒了BZOJ 上所有的数论题后,感觉萌萌哒,想出了这么一道水题,来拯救日益枯竭的水题资源. 给 ...
- node.js实现国标GB28181流媒体点播(即实时预览)服务解决方案
背景 28181协议全称为GB/T28181<安全防范视频监控联网系统信息传输.交换.控制技术要求>,是由公安部科技信息化局提出,由全国安全防范报警系统标准化技术委员会(SAC/TC100 ...
- nginx访问日志中的时间格式修改
1.说明 默认的时间格式是:[08/Mar/2013:09:30:58 +0800],由$time_local变量表示. 我想要改成如下格式:2013-03-08 12:21:03. 2.需要修改的文 ...
- rate limiter - system design
1 问题 Whenever you expose a web service / api endpoint, you need to implement a rate limiter to preve ...
- MySQL存储过程-通过数据库里已存在的IP查询城市
CREATE DEFINER=`mazey`@`%` PROCEDURE `sp_find_city_by_ip`(IN `in_visitor_ip` varchar(20),OUT `out_vi ...
- Android笔记之OnLongClickListener
OnLongClickListener中的回调函数boolean onLongClick(View v),其返回值的官方释义如下 如果这个回调消耗了长点击,则返回true,否则返回false. 即使翻 ...
- 矩阵乘法 NOI2012的一道题
今天,kzj大佬教了我矩阵加速. 让我以这篇随笔表示感谢吧! 这是我刷的一道题:NOI2012 随机数据生成器. 就是普通的矩阵加速,只是要注意的是: 直接用乘法会爆long long,可以参考一下 ...
- [Symfony\Component\Config\Definition\Exception\InvalidConfigurationException] The child node "db_driver" at path "fos_user" must be configured.
$ php bin/console server:run [Symfony\Component\Config\Definition\Exception\InvalidConfigurationExce ...
- Spring MVC 通过反射将数据导出到excel
直接上代码 // 导出excel方法 @RequestMapping("exportExcel") public void exportExcel(HttpServletReque ...
- 每天一个Linux命令(25)chgrp命令
chgrp命令用来改变文件或目录所属的用户组. (1)用法: 用法: chgrp [选项参数] [组] [文件] 或 chgrp [选项] 组文件... POSIX ...