MVC 与 MVVM 的异同

相同点与共通概念基础

MVC 和 MVVM 都是用于分离关注点、提高代码可维护性和可测试性的架构模式,它们都致力于将数据(Model)和界面(View)进行分离,并且引入中间层来处理两者之间的交互。

差异点

交互方式上命令式与声明式的体现

MVC 中的 Controller(命令式风格体现)

  • 控制流程明确:在 MVC 模式里,Controller 充当了 View 和 Model 之间的协调者,通常具有较为明确的控制流程,更偏向于命令式编程。当用户在 View 上进行操作时,View 会向 Controller 发送请求,Controller 接收到请求后,会明确地指挥 Model 进行相应的数据修改,同时也会明确地告诉 View 如何更新显示内容。例如,在一个简单的用户信息管理系统中,当用户点击 “保存” 按钮时,View 通知 Controller,Controller 会调用 Model 的保存方法将用户输入的数据保存到数据库,然后再命令 View 显示保存成功的提示信息。
  • 显式调用与控制:Controller 需要显式地处理各种业务逻辑和交互逻辑,它需要清楚地知道哪个 View 触发了事件,要对哪个 Model 进行操作,以及操作完成后如何更新 View。这就像是一个指挥官,对各个环节进行明确的命令和调度。

MVVM 中的 ViewModel(声明式风格体现)

  • 数据绑定驱动:MVVM 模式更倾向于声明式编程,主要通过数据绑定机制来实现 View 和 Model 之间的交互。View 和 ViewModel 之间通过数据绑定声明了它们之间的关联关系,当 ViewModel 中的属性值发生变化时,会自动更新 View 上的显示内容。
  • 关注点分离更彻底:ViewModel 不需要关心是 View 还是其他地方修改了属性值,它只需要专注于提供数据和处理业务逻辑。当属性值发生变化时,借助发布订阅模式通知 View 进行更新,这种方式减少了代码之间的耦合,使得开发人员可以更专注于业务逻辑的实现。

职责范围与复杂度

  • Controller 的职责与复杂度
    • 广泛的协调工作:Controller 的职责较为广泛,它不仅要处理用户的输入和业务逻辑,还要负责管理 View 的生命周期和状态。在一些复杂的应用中,Controller 可能会变得非常庞大和复杂,包含大量的条件判断和逻辑处理代码,导致代码的可维护性和可测试性下降。
  • ViewModel 的职责与复杂度
    • 聚焦数据与逻辑:ViewModel 的职责相对较为聚焦,主要负责封装 Model 中的数据,将其转换为适合 View 展示的格式,并处理与 View 相关的业务逻辑。它不涉及 View 的具体布局和渲染,只关注数据和逻辑的处理,因此代码结构相对更加清晰,可维护性和可测试性更高。

总结

  • Controller 更类似于“中控台”
    • Controller 需要了解 View 的布局和状态,以及 Model 的数据结构和操作方法,以便能够正确地进行协调和控制。这类似于中控台需要了解车辆各个系统的工作原理和状态,才能实现有效的控制。
  • ViewModel 更类似于“任务发布平台”
    • ViewModel 可以独立于 View 进行开发和测试,它不依赖于具体的 View 实现。这就像任务发布平台可以独立于具体的任务执行者进行运营和管理,只要任务要求和数据明确,不同的执行者都可以根据这些信息完成任务,任务发布平台不关心任务是由哪个执行者完成的,只关注任务的要求和结果,当任务完成情况发生变化时,会通知相关方。

posted on 2025-02-01 21:12  HutatsuiwaKaede  阅读(8)  评论(0编辑  收藏  举报

导航