(Vue)MVVM、MVC、MVP 的区别

MVC、MVP 和 MVVM 是三种常见的软件架构设计模式,主要通过分离关注点的方式来组织代码结构,优化开发效率。

三种常见软件架构设计模式能解决的问题

在开发单页面应用时,往往一个路由页面对应了一个脚本文件,所有的页面逻辑都在一个脚本文件里。页面的渲染、数据的获取,对用户事件的响应所有的应用逻辑都混合在一起,这样在开发简单项目时, 可能看不出什么问题,如果项目变得复杂,那么整个文件就会变得冗长、混乱,这样对项目开发和后期的项目维护是非常不利的。

MVC

  1. Model(模型):

    • 负责存储应用程序的业务数据以及定义对数据的操作。这包括数据的获取、修改、以及数据之间的关系管理。
    • 与数据库通信,执行数据的读写操作,确保数据的一致性和完整性。
    • 实现观察者模式,以便当数据发生变化时通知注册的观察者(通常是 View 层),使其能够更新相应的界面。
  2. View(视图):

    • 负责展示用户界面,以及用户与应用程序交互的方式。这包括页面的布局、样式和显示逻辑。
    • 实现观察者模式,注册对 Model 的观察者,以便在 Model 数据发生变化时更新界面展示。
    • 通常不直接处理业务逻辑,而是将用户的输入传递给 Controller 处理。
  3. Controller(控制器):

    • 充当 Model 层和 View 层之间的桥梁,负责协调用户输入、数据操作和界面更新。
    • 包含事件触发器,用于响应用户的操作(例如按钮点击、表单提交等)。
    • 接收用户输入,调用相应的 Model 方法来修改数据,并确保 View 层及时更新以反映这些变化。
    • 通常包含业务逻辑,确保用户输入的合法性,然后将操作传递给 Model 层执行。

MVVM

  1. Model(模型):

    • 包含应用程序的业务数据和业务逻辑。
    • 与MVC中的Model相似,负责数据的获取、修改以及数据之间的关系管理。
    • 不涉及直接与视图交互,主要用于维护数据的一致性和完整性。
  2. View(视图):

    • 负责用户界面的展示,包括布局、样式和显示逻辑。
    • 与MVC中的View类似,但不直接与Model层通信。它通过ViewModel来获取和展示数据。
    • 不包含业务逻辑,主要关注界面的呈现。
  3. ViewModel(视图模型):

    • 负责连接View和Model,充当二者之间的中介。
    • 监听Model中数据的变化,并通知View层进行相应的更新。这通过数据绑定实现。
    • 包含与用户交互相关的业务逻辑,处理用户输入和操作。
    • 通过数据绑定,使Model和View之间实现双向同步,确保数据的一致性。
    • 通常不涉及具体的UI操作,而是关注数据的转换和逻辑处理。

在MVVM中,Model和View之间不存在直接的联系,它们通过ViewModel进行交互。ViewModel与View之间的数据绑定确保了数据的自动同步,使得开发者可以更专注于数据的处理和业务逻辑,而不必关心DOM操作。这种模式有助于提高代码的可维护性和可测试性,并减少了与用户界面交互的复杂性。

MVP

  1. Model(模型):

    • 与MVC中的Model类似,负责应用程序的业务数据和业务逻辑。
    • 提供数据的获取、修改以及数据之间的关系管理。
  2. View(视图):

    • 负责用户界面的展示,包括布局、样式和显示逻辑。
    • 与MVC中的View类似,但不包含任何关于数据处理和业务逻辑的代码。
    • 暴露接口给Presenter,以便Presenter可以更新视图和响应用户输入。
  3. Presenter(主持人):

    • 充当View层和Model层之间的中介,负责协调二者的交互。
    • 从View层接收用户输入,并根据需要更新Model层的数据。
    • 包含业务逻辑,负责处理用户操作、调用Model层的方法以及更新View层。
    • 通过View层的接口将Model的变化和View的变化绑定在一起,以实现View和Model的解耦。
    • 确保View层和Model层之间的通信是单向的,即View层只能通过Presenter来更新Model。

在MVP中,Presenter的引入解决了MVC中View和Model之间可能存在的紧密耦合问题。Presenter作为中间人,处理用户输入并更新Model,同时通过View的接口更新UI。这种模式提高了代码的可测试性和可维护性,使得项目逻辑更清晰,并减少了View层与Model层之间的直接关系。

相关推荐
派小心.18 分钟前
网站统计采样数据的误差核对
大数据·服务器·前端·数据库·人工智能·小程序·数据分析
变与不变8061 小时前
防抖节流详解
开发语言·前端·javascript
用户72526496629691 小时前
浏览器为什么加载不了超大图片
前端·javascript
酷炫码神1 小时前
Day 2|CSS 盒模型:把昨天的骨架,变成能看的页面
前端·css
Amos_Web2 小时前
我做了一个 Chrome 插件,专治“这篇文章我明明看过,但重点去哪了?”
前端·浏览器
abcyuu2 小时前
用友 U8 Cloud 生产制造模块深度解析:从 BOM 建立到成本核算的技术实现
前端·数据库·制造
零基础1232 小时前
为什么 Agent 用 SQLite 数据库?
前端·人工智能·sqlite·开源
xuyanzhuqing2 小时前
如何在一周内将一个巨石工程实现国际化
前端
数据掘金2 小时前
小程序埋点方案的埋点覆盖率怎么算?
前端
true8032 小时前
跨端开发的相册选择:弃用 uni-app 原生选图 API,直调 Android MediaStore 实现自定义相册架构
前端