热门标签 | 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与模型的紧密耦合可能导致任何一方的变更都需要调整另一方,增加维护成本。此时,可以通过观察者模式或其他机制主动解耦,或者选择不使用这些模式。


推荐阅读
  • 深入解析 Apache Shiro 安全框架架构
    本文详细介绍了 Apache Shiro,一个强大且灵活的开源安全框架。Shiro 专注于简化身份验证、授权、会话管理和加密等复杂的安全操作,使开发者能够更轻松地保护应用程序。其核心目标是提供易于使用和理解的API,同时确保高度的安全性和灵活性。 ... [详细]
  • Java项目分层架构设计与实践
    本文探讨了Java项目中应用分层的最佳实践,不仅介绍了常见的三层架构(Controller、Service、DAO),还深入分析了各层的职责划分及优化建议。通过合理的分层设计,可以提高代码的可维护性、扩展性和团队协作效率。 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • 本章将深入探讨移动 UI 设计的核心原则,帮助开发者构建简洁、高效且用户友好的界面。通过学习设计规则和用户体验优化技巧,您将能够创建出既美观又实用的移动应用。 ... [详细]
  • MySQL索引详解与优化
    本文深入探讨了MySQL中的索引机制,包括索引的基本概念、优势与劣势、分类及其实现原理,并详细介绍了索引的使用场景和优化技巧。通过具体示例,帮助读者更好地理解和应用索引以提升数据库性能。 ... [详细]
  • 本文探讨了领域驱动设计(DDD)的核心概念、应用场景及其实现方式,详细介绍了其在企业级软件开发中的优势和挑战。通过对比事务脚本与领域模型,展示了DDD如何提升系统的可维护性和扩展性。 ... [详细]
  • Startup 类配置服务和应用的请求管道。Startup类ASP.NETCore应用使用 Startup 类,按照约定命名为 Startup。 Startup 类:可选择性地包括 ... [详细]
  • Struts与Spring框架的集成指南
    本文详细介绍了如何将Struts和Spring两个流行的Java Web开发框架进行整合,涵盖从环境配置到代码实现的具体步骤。 ... [详细]
  • 本文作者分享了在阿里巴巴获得实习offer的经历,包括五轮面试的详细内容和经验总结。其中四轮为技术面试,一轮为HR面试,涵盖了大量的Java技术和项目实践经验。 ... [详细]
  • Python自动化测试入门:Selenium环境搭建
    本文详细介绍如何在Python环境中安装和配置Selenium,包括开发工具PyCharm的安装、Python环境的设置以及Selenium包的安装方法。此外,还提供了编写和运行第一个自动化测试脚本的步骤。 ... [详细]
  • Spring Boot 中静态资源映射详解
    本文深入探讨了 Spring Boot 如何简化 Web 应用中的静态资源管理,包括默认的静态资源映射规则、WebJars 的使用以及静态首页的处理方法。通过本文,您将了解如何高效地管理和引用静态资源。 ... [详细]
  • 本文介绍了一个基于 Java SpringMVC 和 SSM 框架的综合系统,涵盖了操作日志记录、文件管理、头像编辑、权限控制、以及多种技术集成如 Shiro、Redis 等,旨在提供一个高效且功能丰富的开发平台。 ... [详细]
  • 在寻找轻量级Ruby Web框架的过程中,您可能会遇到Sinatra和Ramaze。两者都以简洁、轻便著称,但它们之间存在一些关键区别。本文将探讨这些差异,并提供详细的分析,帮助您做出最佳选择。 ... [详细]
  • 本文详细分析了JSP(JavaServer Pages)技术的主要优点和缺点,帮助开发者更好地理解其适用场景及潜在挑战。JSP作为一种服务器端技术,广泛应用于Web开发中。 ... [详细]
  • ssm框架整合及工程分层1.先创建一个新的project1.1配置pom.xml ... [详细]
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社区 版权所有