热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

MVC、MVP、MVVM的区别

MVC视图(View):用户界面。控制器(Controller):业务逻辑模型(

MVC

视图(View):用户界面。
控制器(Controller):业务逻辑
模型(Model):数据操作
V -> C -> M -> C -> V。

Model:即数据模型,用来包装和应用程序的业务逻辑相关的数据或者对数据进行处理,模型可以直接访问数据。表示着业务逻辑和数据,模型把这些数据逻辑渲染到 View 中,比较常见的做法是后端的模版技术,例如 jsp 之类的,把预期的数据填入 jsp 模版中,返回给浏览器。当然,像现在的 restful 应用中,前端都为 SPA 单页面应用,那么 api 返回的 json 数据也相当于为 View。

View:视图用来有目的显示数据,在视图中一般没有程序上的逻辑,为了实现视图上的最新功能,视图需要访问它监视的数据模型。负责 UI 渲染工作,传统的 MVC 中,一个 View 就是一个 Web 页面,通常还有有 Javascript 代码在其中负责一些页面逻辑。

Controller:控制器调控模型和视图的联系,它控制应用程序的流程,处理事件并作出响应,事件不仅仅包括用户的行为还有数据 模型上的改变。通过捕获用户事件,通知模型层作出相应的更新处理,同时将模型层的更新和改变通知给视图,使得视图作出相应改变。因此控制器保证了视图和模型的一致性。

Controller 控制器就相当于一个分发的工具,熟悉 Spring 的同学肯定就知道这就是 Spring 中的 @Controller,一个请求进来,需要什么样的 Model,获取什么样的数据,返回什么样的页面,都是 Controller 的工作。

一般来说,MVC 中的数据流动是单向的,Model 用数据来渲染 View,View 用户界面交互完成后更新数据,然后 Controller 做分发和控制。但是从交互的角度来看并不是单向的,有些情况下,Controller 当收到更新数据请求的时候,Controller 会更新数据,更新完就会重定向到的 View ,View 拿到更新完的 Model 数据,进行渲染,Controller 多充当了一个调度者的角色。

MVP

MVP 模式将 Controller 改名为 Presenter(主持人),同时改变了通信方向。
在这里插入图片描述

  1. 各部分之间的通信,都是双向的。
  2. View 与 Model 不发生联系,都通过 Presenter 传递。
  3. View 非常薄,不部署任何业务逻辑,称为"被动视图"(Passive View),即没有任何主动性,而 Presenter非常厚,所有逻辑都部署在那里。

MVVM

MVVM 模式将 Presenter 改名为 ViewModel,基本上与 MVP 模式完全一致。

在这里插入图片描述
唯一的区别是,它采用双向绑定(data-binding):View的变动,自动反映在 ViewModel,反之亦然。Vue 采用这种模式。

实例

功能:select 选择器选择哪个展示哪个

<select id&#61;"drinkSelect"><option value&#61;"coffee">coffee</option><option value&#61;"milk">milk</option><option value&#61;"juice">juice</option>
</select>
<p id&#61;"theColorOfDrink"></p><script type&#61;"text/Javascript">
document.getElementById("drinkSelect").onchange &#61; function() {var color;var colorOfDrink &#61; {"coffee":"brown","milk":"white","juice":"orange"};color &#61; colorOfDrink[this.value];document.getElementById("theColorOfDrink").innerHTML &#61; color;
}
</script>

改为 MVC

<select id&#61;"drinkSelect"><option value&#61;"coffee">coffee</option><option value&#61;"milk">milk</option><option value&#61;"juice">juice</option>
</select>
<p id&#61;"theColorOfDrink"></p><script type&#61;"text/Javascript">
//showDrinkColor is Controller
var showDrinkColor &#61; {start:function(){this.view.start();},set:function(drinkName){this.model.setDrink(drinkName);}
};
//Model
showDrinkColor.model &#61; {colorOfDrink:{"coffee":"brown","milk":"white","juice":"orange"},selectedDrink:null,setDrink:function(drinkName){this.selectedDrink &#61; this.colorOfDrink[this.selectedDrink]?drinkName:null;this.onchange();},onchange:function(){showDrinkColor.view.update();},getDrinkColor:function(){return this.selectedDrink?this.colorOfDrink[this.selectedDrink]:"white";}
};
//View
showDrinkColor.view &#61; {start:function(){document.getElementById("drinkSelect").onchange &#61; this.onchange;},onchange:function(){showDrinkColor.set(document.getElementById("drinkSelect").value);},update:function(){document.getElementById("theColorOfDrink").innerHTML &#61; showDrinkColor.model.getDrinkColor();}
};
showDrinkColor.start();
</script>

总结


以下是我个人的一些理解&#xff1a;

如果把整个 web 开发看做一个整体&#xff0c;那么前后端不分离时期的 MVC&#xff1a;

  • M&#61;后端操作数据等
  • V&#61;后端模板渲染的视图
  • C&#61;后端路由等

如果把整个 web 开发看做一个整体&#xff0c;那么前后端分离时期的 MVC&#xff1a;

  • M&#61;后端CRUD
  • V&#61;前端视图层
  • C&#61;前端控制器

对于纯web后台的&#xff0c;MVC是&#xff1a;

  • M&#61;数据对象 &#43; 数据访问 &#43; 业务逻辑&#xff0c;必要时可以分层
  • C&#61;路由 &#43; 视图逻辑
  • V&#61;接口开发这层可以不要

对于纯前端的&#xff0c;MVC是&#xff1a;

  • M&#61;前端数据层&#xff0c;比如 vue 中的 data
  • C&#61;路由 &#43; 视图逻辑
  • V&#61;前端视图

以下是别人的一些理解


  • MVC也好&#xff0c;MVP也好&#xff0c;MVVM也好&#xff0c;重要的是针对应用场景和需求对M、V、C三层进行划分&#xff0c;三层间的交互也是如此。只要确定了架构后遵循一定的原则&#xff0c;在开发过程中尽量不破坏原有规则&#xff0c;直到现有的架构规则不能满足需求&#xff0c;再重新制定。这样应该就能在满足应用场景需求的同时&#xff0c;使得项目有明确清晰的层次。在比较框架的定义和优劣时&#xff0c;也要有一定的场景说明才有实际意义。
  • MVC在bs架构和cs架构上差别很大&#xff0c;即使同是bs&#xff0c;因为使用的技术的差别&#xff0c;业务的差别&#xff0c;架构的差别&#xff0c;MVC的通信方式也会和原来你书本上看到的不一样。就像backbonejs和angularjs的出现&#xff0c;是发明还是延伸&#xff0c;还是糟蹋&#xff1f;每天和它一起工作的人才知道。
    所有的设计应该以贴近自然或接近自然规律为目标。再通俗的讲&#xff0c;用的舒服就是自然。好的东西绝对不需要强记一堆原理来理解的。

推荐阅读
  • 使用JS、HTML5和C3创建自定义弹出窗口
    本文介绍如何结合JavaScript、HTML5和C3.js来实现一个功能丰富的自定义弹出窗口。通过具体的代码示例,详细讲解了实现过程中的关键步骤和技术要点。 ... [详细]
  • 深入理解Vue.js:从入门到精通
    本文详细介绍了Vue.js的基础知识、安装方法、核心概念及实战案例,帮助开发者全面掌握这一流行的前端框架。 ... [详细]
  • 我有一个SpringRestController,它处理API调用的版本1。继承在SpringRestControllerpackagerest.v1;RestCon ... [详细]
  • Redux入门指南
    本文介绍Redux的基本概念和工作原理,帮助初学者理解如何使用Redux管理应用程序的状态。Redux是一个用于JavaScript应用的状态管理库,特别适用于React项目。 ... [详细]
  • 本文详细介绍如何使用 HTML5 和 JavaScript 实现一个交互式的画板功能。通过具体代码示例,帮助读者理解 Canvas API 的基本用法及其在绘图应用中的实际应用。 ... [详细]
  • 深入解析SpringMVC核心组件:DispatcherServlet的工作原理
    本文详细探讨了SpringMVC的核心组件——DispatcherServlet的运作机制,旨在帮助有一定Java和Spring基础的开发人员理解HTTP请求是如何被映射到Controller并执行的。文章将解答以下问题:1. HTTP请求如何映射到Controller;2. Controller是如何被执行的。 ... [详细]
  • 本文详细探讨了JavaScript中的作用域链和闭包机制,解释了它们的工作原理及其在实际编程中的应用。通过具体的代码示例,帮助读者更好地理解和掌握这些概念。 ... [详细]
  • 本文介绍了如何在多线程环境中实现异步任务的事务控制,确保任务执行的一致性和可靠性。通过使用计数器和异常标记字段,系统能够准确判断所有异步线程的执行结果,并根据结果决定是否回滚或提交事务。 ... [详细]
  • JavaScript 中创建对象的多种方法
    本文详细介绍了 JavaScript 中创建对象的几种常见方式,包括对象字面量、构造函数和 Object.create 方法,并提供了示例代码和属性描述符的解释。 ... [详细]
  • 深入解析Java枚举及其高级特性
    本文详细介绍了Java枚举的概念、语法、使用规则和应用场景,并探讨了其在实际编程中的高级应用。所有相关内容已收录于GitHub仓库[JavaLearningmanual](https://github.com/Ziphtracks/JavaLearningmanual),欢迎Star并持续关注。 ... [详细]
  • Java项目分层架构设计与实践
    本文探讨了Java项目中应用分层的最佳实践,不仅介绍了常见的三层架构(Controller、Service、DAO),还深入分析了各层的职责划分及优化建议。通过合理的分层设计,可以提高代码的可维护性、扩展性和团队协作效率。 ... [详细]
  • 简化报表生成:EasyReport工具的全面解析
    本文详细介绍了EasyReport,一个易于使用的开源Web报表工具。该工具支持Hadoop、HBase及多种关系型数据库,能够将SQL查询结果转换为HTML表格,并提供Excel导出、图表显示和表头冻结等功能。 ... [详细]
  • 本文总结了优化代码可读性的核心原则与技巧,通过合理的变量命名、函数和对象的结构化组织,以及遵循一致性等方法,帮助开发者编写更易读、维护性更高的代码。 ... [详细]
  • 本文介绍如何从字符串中移除大写、小写、特殊、数字和非数字字符,并提供了多种编程语言的实现示例。 ... [详细]
  • ElasticSearch 集群监控与优化
    本文详细介绍了如何有效地监控 ElasticSearch 集群,涵盖了关键性能指标、集群健康状况、统计信息以及内存和垃圾回收的监控方法。 ... [详细]
author-avatar
平凡的稳健投资
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有