一、引子

一个系统可能由很多子系统组成。各子系统内部高度内聚,子系统之间低耦合。子系统关注自己的职责。实现:   职责分离,关注点分离。----MVC架构早期就是为了分离视图、模型而诞生的。

注:很多地方说MVC是一种设计模式,博主认为,精确来说MVC是一种架构模式(软件架构(三)名词解释:架构、设计、风格、模式),一种通用设计方案,发展至今,已不局限于前端或后端。例如springMVC就是其中一种落地实践。

二、MVC的发展史

MVC有很多变种,这里列出对现在行业影响最大的几种,逐一说明。老司机可以直接跳到第三节。

2.1 MVC(Model-View-Controller)

Trygve Reenskaug 于1979 年提出了 MVC 模式,来分离关注点,将 UI 和业务逻辑隔离。

MVC 模式将代码拆分成了三个概念单元:

  • Model (模型):代表业务逻辑 ;
  • View (视图):代表 UI 控件,按钮、文本框等等;
  • Controller(控制器):在视图和模型之间居中协调 ,这意味着:
    • 它决定显示哪些视图以及哪些数据;
    • 它将用户操作(例如点击按钮)转换成业务逻辑。

最初的 MVC 模式还有其它一些需要了解的的重要概念:

  1. View 直接使用 Model 数据对象来展示数据;
  2. 当 Model 发生变化时,会触发一个事件立即更新 View(记住,1979年还没有 HTTP);
  3. 每一个 View 通常只关联一个 Controller;
  4. 每个界面可以包含多对 View 和 Controller;
  5. 每个Controller 可以对应多个 View。

2.2 MVP(Model-View-Presenter)

1996 年,IBM 的子公司 Taligent 公开了他们基于 MVC 的 模式 MVP。其思想是将 Model 对 UI 的关注更彻底地分离

  • View 是被动的,对 Model 无感知
  • 专注于轻量 Controller(Presenter),它们不包含任何业务逻辑,只是简单地调用命令/查询模型,将原始数据传递给 View;
  • 数据的变化不会直接触发 View 的更新:它始终要通过 Presenter,由 Presenter 来更新 View。这样在更新视图之前 Controller(Presenter) 还可以执行一些和展现相关的额外逻辑。例如,同时更新另一些数据,它们和数据库中发生变化的数据有关;
  • 每个 View 对应一个 Presenter。

这更接近我所见到的现在的请求/响应范式:数据流始终要经过 Controller/Presenter。不过,Presenter 仍然不会主动更新视图,它始终需要执行一次新的请求才能让变化可见。

MVP 中的 Presenter 又被称为 Supervisor Controller监督控制器。

2.3 MVVM(Model-View-ViewModel)

由于应用程序的复杂性还在增加,2005 年微软的 WPF 和 Silverlight 架构师 John Gossman 又提出了 MVVM 模式,目标是进一步将 UI 设计从代码中分离出来,并提供 View 到数据模型的数据绑定机制。

MVVM 背后的思想是:

  • ViewModel 和 View 一 一对应;
  • 将 View 中的逻辑转移到 ViewModel 来简化 View;
  • View 使用的数据和 ViewModel 中的数据一 一对应;
  • 将 ViewModel 中的数据绑定到 View 中的数据上,这样 ViewModel 中数据的变化会立即体现在 View 上。

2.4 MVPVM(Model-View-Presenter-ViewModel)

MVPVM中, View Model 是 Martin Fowler 在 2004 年提出的 Presentation Model,。

  • Model

    一组包含业务逻辑和用例的类。

  • View

    一个模板,模板引擎用它来生成 HTML;

  • ViewModel(又叫做 Presentation Model)

    从查询中接收(或者从 Model 实体中提取)原始数据,持有这些模板会用到的数据。它还要封装复杂的展现逻辑,来简化Model。这样我们才能将 View 和 Model 完全隔离开:

    • Model 中的变化(比如实体结构的变化)会上升并影响 ViewModel,但不会影响Model;
    • 复杂的展现逻辑被封装到了 ViewModel 之中,因此不会被泄露到领域(DDD领域设计的domain)之中;
    • Model的依赖变得很清晰,因为它们必须在 ViewModel 中设置。
  • Presenter

    接收 HTTP 请求,触发命令或查询,使用查询返回的数据、ViewModel、模板和模板引擎生成 HTML 并将它返回给客户端。所有 View 的交互都要经过 Presenter。

三、总结

我们对比MVC、MVP、MVVM、MVPVM的变种升级过程,可以更好的了解架构的历史变迁。

快速区分几种架构:

  1. MVC:初步分离Model、View。
  2. MVP:Controller转变为Presenter模型和视图彻底分离。  
  3. MVVM:废弃控制器层。增加ViewModel,实现Model和View的双向驱动。
  4. MVPVM:保留Presenter做页面交互,新增ViewModel给View做数据接收和展示。

=========参考============

https://herbertograca.com/2017/08/17/mvc-and-its-variants/

软件架构(六)MVC架构历史的更多相关文章

  1. 【.Net架构】BIM软件架构03:Web管控平台MVC架构

    一.前言        上一篇讲述的是将BIM平台后台架构CoreService.sln,该解决方案主要作用是对管控平台的核心业务进行封装,然后让前端的ApiController去调用该解决方案中的对 ...

  2. 【JAVA】基于MVC架构Java技术荟萃案例演练

    基于JAVA-MVC技术的顾客管理项目案例总结 作者 白宁超 2016年6月9日22:47:08 阅读前瞻:本文源于对javaweb相关技术和资料汇总,涉及大量javaweb基础技术诸如:Servle ...

  3. MVC架构杂谈

    来源:伯乐在线专栏作者 - 林欣达 链接:http://ios.jobbole.com/86895/ 点击 → 了解如何加入专栏作者 前言 MVC是软件工程中的一种软件架构模式,它把软件系统分为三个基 ...

  4. MVC架构模式详细说明

    一.简介: 架构模式是一个通用的.可重用的解决方案,用于在给定上下文中的软件体系结构中经常出现的问题.架构模式与软件设计模式类似,但具有更广泛的范围. 模型-视图-控制器模式,也称为MVC模式(Mod ...

  5. MVC架构、WebForm与MVC对比

    ylbtech-ASP.NET MVC:WebForm与MVC对比 功能描述:WebForm与MVC对比 A.1,MVC架构 •MVC(Model-View-Controller)用于表示一种软件架构 ...

  6. 设计模式之美学习(九):业务开发常用的基于贫血模型的MVC架构违背OOP吗?

    我们都知道,很多业务系统都是基于 MVC 三层架构来开发的.实际上,更确切点讲,这是一种基于贫血模型的 MVC 三层架构开发模式. 虽然这种开发模式已经成为标准的 Web 项目的开发模式,但它却违反了 ...

  7. wxWidgets源码分析(8) - MVC架构

    目录 MVC架构 wxDocManager文档管理器 模板类创建文档对象 视图对象的创建 创建顺序 框架菜单命令的执行过程 wxDocParentFrame菜单入口 wxDocManager类的处理 ...

  8. Android 四大组件 与 MVC 架构模式

    作为一个刚从JAVA转过来的Android程序员总会思考android MVC是什么样的? 首先,我们必须得说Android追寻着MVC架构,那就得先说一下MVC是个啥东西! 总体而来说MVC不能说是 ...

  9. MVC架构模式分析与设计(一)---简单的mvc架构

    首先 我要感谢慕课网的老师提供视频资料 http://www.imooc.com/learn/69 下面我来进行笔记 我们制作一个简单的mvc架构 制作第一个控制器 testController.cl ...

随机推荐

  1. DolphinScheduler & K8s 在优路科技的实践

    T 摘要 · 本文通过介绍DolphinScheduler on Kubernetes 在优路科技的实践,阐述了DolphinScheduler如何在云原生时代,更好地助力企业实现高效的数据调度解决方 ...

  2. Synchronized锁升级原理与过程深入剖析

    Synchronized锁升级原理与过程深入剖析 前言 在上篇文章深入学习Synchronized各种使用方法当中我们仔细介绍了在各种情况下该如何使用synchronized关键字.因为在我们写的程序 ...

  3. python包合集-cffi

    一.cffi cffi是连接Python与c的桥梁,可实现在Python中调用c文件.cffi为c语言的外部接口,在Python中使用该接口可以实现在Python中使用外部c文件的数据结构及函数. 二 ...

  4. Luogu4408 [NOI2003]逃学的小孩 (树的直径)

    一边一定是直径,另一边从两端点走取最小值的最大值 #include <iostream> #include <cstdio> #include <cstring> ...

  5. Mysql_索引总结笔记

    Mysql 索引总结 1. 聚簇索引 InnoDB 引擎使用的就是聚簇索引,就是主键的索引,是一种数据的存储方式.所有的数据都是存储在索引的叶子结点上(与MySAM 引擎不同,MySAM是传统方式), ...

  6. 《吐血整理》进阶系列教程-拿捏Fiddler抓包教程(19)-Fiddler精选插件扩展安装,将你的Fiddler武装到牙齿

    1.简介 Fiddler本身的功能其实也已经很强大了,但是Fiddler官方还有很多其他扩展插件功能,可以更好地辅助Fiddler去帮助用户去开发.测试和管理项目上的任务.Fiddler已有的功能已经 ...

  7. .Net下的高效分页

    本文技术方案支持.Net/.Net Core/.Net Framework 数据分页,几乎是任何应用系统的必备功能.但当数据量较大时,分页操作的效率就会变得很低.大数据量分页时,一个操作耗时5秒.10 ...

  8. MasaFramework的MinimalAPI设计

    在以前的MVC引用程序中,控制器负责接收输入信息.执行.编排操作并返回响应,它是一个功能齐全的框架,它提供了过滤器.内置了模型绑定与验证,并提供了很多可扩展的管道,但它偏重,不像其它语言是通过更加简洁 ...

  9. Elasticsearch : alias数据类型

    就像其他的很多语言一样,我们可以给已有的变量取一个别名(alias).即便是对高级语言一样,比如我们定义不同的指针变量,指向同一个内存空间.这个有些类似别名的概念. 在Elasticsearch中,我 ...

  10. 启动elasticsearch报错解决

    说不定以后会不定期更新该文档 1.提示文件描述符数量太少,修改/etc/security/limits.conf文件,添加. * soft nofile 65537 * hard nofile 655 ...