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

MVC、MVP、MVVM及MVA架构模式对比分析

模型-视图-控制器(MVC)模式在软件开发中极为普遍,不仅被广泛应用于Web框架,也在GUI客户端中得到应用。然而,这种模式的实际应用可能并非完全遵循原初的设计理念,有时更像是一个营销概念。本文将深入探讨MVC及其相关模式MVP、MVVM和MVA的异同,以及它们各自的应用场景。

模型-视图-控制器(MVC)模式在软件开发领域几乎无处不在,无论是Web框架还是GUI客户端,都能看到它的身影。然而,这种模式的实际应用往往与最初的设计理念有所偏差,有时甚至被视为一种营销策略。实际上,许多开发者和框架可能在使用类似于模型-视图-适配器(MVA)等其他模式。


MVC的起源


MVC模式最早出现在20世纪70年代,由Alan Kay和他的团队在Xerox Parc进行Dynabook和Smalltalk项目研究时提出。Trygve MH Reenskaug回忆说:“我提出了模型-视图-控制器模式,作为一种从多个视角解决用户控制其信息问题的方法。MVC引起了广泛的关注,但也有误解,甚至被用于实现计算机控制用户的相反目标。”尽管MVC未被收录在1994年出版的《设计模式》一书中,但Smalltalk的实现常被视为MVC的参考标准,因为它是首个被多个项目和开发者采用的实例。


2003年,Reenskaug重新评估了他的设计,将其细分为多种模式,称为MVC模式语言,包括:



  • “模型/编辑器分离”,强调模型与用户界面的分离,使模型更贴近用户的心理模型,这是良好面向对象设计的重要特征。

  • “输入/输出分离”,涉及通过控制器处理用户输入和通过视图展示模型信息,这一概念源自Smalltalk-80的实现。

  • “任务工具”模式,即提供用户执行任务的工具,使其感觉像是直接与模型互动。


从设计模式的角度来看,控制器和视图组件可以视为模型的外观模式(Facade Pattern)。


基于架构原则的MVC解读


MVC模式也可从架构原则出发进行理解,主要包含两个步骤,直接对应Reenskaug提出的“模型/编辑器分离”和“输入/输出分离”:



  1. 在分层架构中,UI层应与底层模型分离,确保低层不了解高层,通过抽象实现松耦合,通常利用观察者模式从模型通知UI。

  2. 为了提高内聚性,需将用户交互与图形表现分离,因此UI层进一步划分为控制器和视图。两者均直接引用模型,位于同一层次,允许自由交互而无需观察者模式解耦。


这种设计解释了为何模型应在控制器和视图之下。不过,在现代环境下,严格区分控制器和视图的需求并不强烈。John Gossmann在2005年指出:“控制器在现代GUI开发中的角色变得模糊……它依然存在,但不再像1979年那样需要特别关注。”


MVC的演变


Model-View-Presenter(MVP)是MVC的一种变体,其类图与MVC相同,只是将“Controller”替换为“Presenter”。这一变化反映了实际操作上的区别:MVC中的控制器主要负责处理用户输入并更新模型,而MVP中的Presenter则侧重于更新模型,视图同样处理输入。


Model-View-ViewModel(MVVM)进一步将输入处理集成到视图中,彻底解耦模型与视图。不同于MVC中视图直接链接到模型,MVVM引入ViewModel作为中介,实现了视图与模型的间接通信。例如,ViewModel中常见的选择逻辑可以同时影响多个GUI组件。


MVVM模式的主要优势在于允许UI设计师在没有编程知识的情况下,通过XML定义视图,从而降低开发门槛。此外,MVVM也是Martin Fowler提出的被动视图(Passive View)模式的具体实现,旨在通过减少GUI组件中的逻辑,提高代码的可测试性。


模型-视图-适配器(MVA)


MVA模式彻底解耦了模型与视图,但并不排除视图中的逻辑处理。输入同样来源于视图,因此控制器在这里充当纯适配器的角色。当需要将数据库结构与用户界面分离时,适配器的作用尤为显著。


值得注意的是,MVA和MVVM在类图上是同构的,可以认为MVVM是针对WPF应用程序特化的MVA版本。


结论


MVC并不是一个界限分明的概念,不应将其视为固定不变的模式。在特定的开发环境中,如Android应用开发,MVC可能有明确的定义,但在大多数情况下,它更像是一个宽泛的概念。在设计系统时,盲目追求MVC或其他类似模式并无益处。更重要的是识别潜在的问题,并采取适当的措施解决。例如,UI与模型的紧密耦合可能导致任何一方的变更都需要调整另一方,增加维护成本。此时,可以通过观察者模式或其他机制主动解耦,或者选择不使用这些模式。


推荐阅读
  • 使用 ModelAttribute 实现页面数据自动填充
    本文介绍了如何利用 Spring MVC 中的 ModelAttribute 注解,在页面跳转后自动填充表单数据。主要探讨了两种实现方法及其背后的原理。 ... [详细]
  • 深入理解SAP Fiori及其核心概念
    本文详细介绍了SAP Fiori的基本概念、发展历程、核心特性、应用类型、运行环境以及开发工具等,旨在帮助读者全面了解SAP Fiori的技术框架和应用场景。 ... [详细]
  • MVC模式下的电子取证技术初探
    本文探讨了在MVC(模型-视图-控制器)架构下进行电子取证的技术方法,通过实际案例分析,提供了详细的取证步骤和技术要点。 ... [详细]
  • 本文旨在为初学者提供一个详细的指南,从零开始学习如何使用 ASP.NET MVC5 和 Entity Framework 6 (EF6) 搭建项目。通过逐步指导,帮助读者理解 MVC 架构的核心概念,并掌握基本的操作方法。 ... [详细]
  • 探讨并提供解决方案以应对 'view is not in the window hierarchy' 的错误提示。 ... [详细]
  • 本文介绍了多种Eclipse插件,包括XML Schema Infoset Model (XSD)、Graphical Editing Framework (GEF)、Eclipse Modeling Framework (EMF)等,涵盖了从Web开发到图形界面编辑的多个方面。 ... [详细]
  • 华为云openEuler环境下的Web应用部署实践
    本文详细记录了在华为云openEuler系统上进行Web应用部署的具体步骤,包括配置yum源、安装Apache、MariaDB、PHP及其相关组件,并完成WordPress的安装与配置过程。 ... [详细]
  • 本文将详细介绍如何配置并整合MVP架构、Retrofit网络请求库、Dagger2依赖注入框架以及RxAndroid响应式编程库,构建高效、模块化的Android应用。 ... [详细]
  • 本文探讨了Flutter和Angular这两个流行框架的主要区别,包括它们的设计理念、适用场景及技术实现。 ... [详细]
  • iOS 小组件开发指南
    本文详细介绍了iOS小部件(Widget)的开发流程,从环境搭建、证书配置到业务逻辑实现,提供了一系列实用的技术指导与代码示例。 ... [详细]
  • iOS如何实现手势
    这篇文章主要为大家展示了“iOS如何实现手势”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“iOS ... [详细]
  • egg实现登录鉴权(七):权限管理
    权限管理包含三部分:访问页面的权限,操作功能的权限和获取数据权限。页面权限:登录用户所属角色的可访问页面的权限功能权限:登录用户所属角色的可访问页面的操作权限数据权限:登录用户所属 ... [详细]
  • 如何高效渲染JSON数据
    本文介绍了在控制器中返回JSON结果的方法,并详细说明了如何利用jQuery处理和展示这些数据,为Web开发提供了实用的技巧。 ... [详细]
  • 本文介绍了如何在AngularJS应用中使用ng-repeat指令创建可单独点击选中的列表项,并详细描述了实现这一功能的具体步骤和代码示例。 ... [详细]
  • 默认情况下,Git 使用 Nano 编辑器进行提交信息的编辑,但如果您更喜欢使用 Vim,可以通过简单的配置更改来实现这一变化。本文将指导您如何通过修改全局配置文件来设置 Vim 作为默认的 Git 提交编辑器。 ... [详细]
author-avatar
手机用户2502858383_827
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有