跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI 生图工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
编程语言大前端java

MVC、MVP、MVVM 架构详解

详细解析了软件工程中三种主流架构模式:MVC、MVP 和 MVVM。通过可视化图解和深度分析,阐述了各模式中 View、Model 及中间层的职责与交互方式。MVC 强调 Controller 中转与 View 自主渲染,适用于 Web 后端;MVP 通过接口解耦 View 与 Presenter,适合桌面及原生开发;MVVM 利用双向绑定实现数据驱动,是现代前端主流。文章最后对比了三者的核心特点、适用场景及选择逻辑,帮助开发者理解架构设计本质并做出合理选型。

ByteFlow发布于 2026/3/29更新于 2026/9/1277 浏览

MVC、MVP、MVVM 架构详解


1. 前言

在软件开发中,界面与业务逻辑分离是代码可维护、可扩展、可测试的关键。

MVC、MVP、MVVM 是目前最主流的三种架构设计模式,它们的核心目标一致: 解耦 View(界面)与 Model(数据/业务),让结构更清晰。

本文不仅提供可视化图解,还对每个架构的可视化逻辑做深度解析,帮你理解'为什么这么设计''每个箭头/符号代表什么'。


2. 三大核心角色统一说明

无论 MVC / MVP / MVVM,都由以下 3 个基础角色构成:

  • View(视图)
    用户直接看到的界面。
    职责:展示数据、接收用户操作(点击、输入、滑动等)。
    可视化标识:始终放在最上层,代表用户直接交互层。
  • Model(模型)
    数据与业务的核心。
    职责:数据处理、业务逻辑、数据库操作、计算、验证。
    可视化标识:始终放在最下层,代表底层数据/业务层。
  • 中间层(Controller / Presenter / ViewModel)
    View 与 Model 之间的调度者。
    可视化标识:始终放在中间层,代表'桥梁/调度中心'。

3. MVC 架构(Model-View-Controller)

定位

最经典的架构模式,Web 后端首选。

🎨 可视化图画(深度解析版)

 ┌───────────────┐ 🔹 上层:用户交互层,主动发起请求 │ View │ 🔹 核心:自主展示,有渲染决策权 │ (界面) │ └───────┬───────┘ │ 🔹 单向箭头:View → Controller 仅传递'操作请求' ▼ ┌───────────────┐ 🔹 中间层:纯中转,无展示决策权 │ Controller │ 🔹 核心:接收请求→调用Model→返回数据 │ (控制器) │ └───────┬───────┘ │ 🔹 单向箭头:Controller → Model 仅传递'数据处理指令' ▼ ┌───────────────┐ 🔹 下层:纯数据/业务处理,无界面感知 │ Model │ 🔹 核心:处理数据后,仅返回结果给Controller │(数据/业务) │ └───────────────┘ │ │ 🔹 单向箭头:Model → Controller 仅返回'处理结果' ▼ ┌───────────────┐ │ Controller │ 🔹 中间层二次处理:将Model结果整理为View可展示格式 │ (控制器) │ └───────┬───────┘ │ 🔹 单向箭头:Controller → View 仅传递'整理后的数据' ▼ ┌───────────────┐ │ View │ 🔹 最终:View自主决定数据渲染方式(排版/样式) │ (界面) │ └───────────────┘ 

可视化深度解析

  1. 层级逻辑:严格的'上→中→下→中→上'单向层级流转,代表'用户操作→请求中转→数据处理→结果返回→界面展示'的完整闭环;
  2. 箭头含义:所有箭头均为单向,代表'请求/数据只能按固定方向传递',View 无法直接调用 Model,Model 也无法直接通知 View;
  3. 角色边界:
    • View 只做'发起请求 + 自主展示',不碰业务逻辑;
    • Controller 只做'中转 + 数据整理',不做展示决策;
    • Model 只做'数据处理',完全不知道界面存在。

执行流程

  1. 用户在 View 上操作(点击按钮、输入内容)
  2. View 主动将请求发送给 Controller(仅传递'做什么',不传递'怎么做')
  3. Controller 接收请求后,调用 Model 执行具体业务(如查询数据库)
  4. Model 处理完成,将原始结果返回给 Controller
  5. Controller 将原始结果整理为 View 可直接使用的格式(如把时间戳转成'yyyy-MM-dd')
  6. View 自主决定如何展示数据(如表格列宽、数据排序、是否高亮)

核心特点

  • View 有自主性:拿到数据后,自己决定渲染样式,Controller 不干预;
  • Controller 是纯中转:只负责'传请求、传数据',无业务决策;
  • 解耦程度:View 与 Model 完全隔离,但 View 与 Controller 耦合度高(View 需知道'找哪个 Controller 发请求');
  • 适用场景:ASP.NET MVC、Spring MVC 等 Web 项目(后端驱动,界面渲染由前端/View 自主完成)。

4. MVP 架构(Model-View-Presenter)

定位

MVC 的改进版,桌面/移动端原生首选(WinForm、Android、iOS)。

🎨 可视化图画(深度解析版)

 ┌───────────────┐ 🔹 上层:纯展示层,无任何决策/逻辑能力 │ View │ 🔹 核心:仅做'接收操作 + 被动展示' │ (界面) │ └───────┬───────┘ │ ↕ 🔹 双向箭头:View ↔ Presenter 基于'接口通信' │ ↕ 🔹 View → Presenter:仅传递'操作事件'(无数据处理) │ ↕ 🔹 Presenter → View:直接控制'展示内容 + 样式' ▼ ┌───────────────┐ 🔹 中间层:全权控制层,接管所有逻辑/展示决策 │ Presenter │ 🔹 核心:接收事件→调用Model→决定展示方式→控制View │ (呈现器) │ └───────┬───────┘ │ 🔹 单向箭头:Presenter → Model 传递'数据处理指令' ▼ ┌───────────────┐ 🔹 下层:纯数据/业务处理,无界面感知 │ Model │ 🔹 核心:处理数据后,仅返回结果给Presenter │(数据/业务) │ └───────────────┘ │ │ 🔹 单向箭头:Model → Presenter 仅返回'处理结果' ▼ ┌───────────────┐ │ Presenter │ 🔹 中间层决策:决定数据展示样式/内容 │ (呈现器) │ └───────┬───────┘ │ ↕ 🔹 双向箭头:Presenter → View 直接赋值/控制展示 ▼ ┌───────────────┐ │ View │ 🔹 最终:View完全按Presenter要求展示,无自主决策 │ (界面) │ └───────────────┘ 

可视化深度解析

  1. 核心符号:↕ 代表'双向接口通信',是 MVP 与 MVC 最核心的区别——View 暴露标准化接口(如 GetInputText()、ShowDataList()),Presenter 通过接口操作 View,而非直接依赖 View 类;
  2. 层级逻辑:'上→中→下→中→上'但中间层(Presenter)是'主控者',而非'中转者';
  3. 角色边界:
    • View 是'纯傀儡':无逻辑、无决策,仅实现接口,Presenter 让做什么就做什么;
    • Presenter 是'全能管理者':既处理业务逻辑,又决定展示方式,还直接控制 View;
    • Model 职责与 MVC 一致:仅处理数据,无界面感知。

执行流程

  1. 用户在 View 操作(点击按钮)
  2. View 调用自身接口,仅将'操作事件'通知 Presenter(如 OnQueryButtonClick()),不处理任何逻辑;
  3. Presenter 接收事件后,调用 Model 执行业务(如查询数据库);
  4. Model 返回原始数据给 Presenter;
  5. Presenter 决定'数据该怎么展示'(如表格显示 3 列、隐藏敏感数据、设置字体颜色);
  6. Presenter 通过 View 接口直接控制展示(如 View.ShowDataList(data)、View.SetTableStyle(style)),View 被动展示。

核心特点

  • View 零自主:连'怎么展示'的决策权都没有,完全由 Presenter 控制;
  • 解耦程度:View 与 Presenter 基于接口解耦(可替换 View 实现,如 WinForm 换 WPF,Presenter 无需修改),View 与 Model 完全隔离;
  • 测试友好:可直接模拟 View 接口测试 Presenter,无需启动界面;
  • 适用场景:WinForm、WPF、Android、iOS 原生开发(界面逻辑固定,需强解耦、易测试)。

5. MVVM 架构(Model-View-ViewModel)

定位

现代化数据驱动架构,前端/跨平台首选,目前最主流。

🎨 可视化图画(深度解析版)

 ┌───────────────┐ 🔹 上层:纯展示层,仅绑定数据,无逻辑 │ View │ 🔹 核心:数据绑定→自动刷新,无手动操作 │ (界面) │ └───────┬───────┘ │ ╍╍╍╍╍ 🔹 双向绑定符号:代表'数据自动同步' │ ╍双向绑定╍ 🔹 View ↔ ViewModel 数据实时同步,无代码干预 │ ╍╍╍╍╍ ▼ ┌───────────────┐ 🔹 中间层:View专属数据模型,适配 + 同步 │ ViewModel │ 🔹 核心:数据适配 + 命令处理 + 自动同步 │ (视图模型) │ └───────┬───────┘ │ 🔹 单向箭头:ViewModel → Model 传递'数据处理指令' ▼ ┌───────────────┐ 🔹 下层:纯数据/业务处理,无界面感知 │ Model │ 🔹 核心:处理数据后,仅返回结果给ViewModel │(数据/业务) │ └───────────────┘ │ │ 🔹 单向箭头:Model → ViewModel 仅返回'处理结果' ▼ ┌───────────────┐ │ ViewModel │ 🔹 中间层适配:将Model数据转为View可绑定格式 │ (视图模型) │ └───────┬───────┘ │ ╍╍╍╍╍ 🔹 双向绑定:ViewModel 数据变化→View 自动刷新 ▼ ┌───────────────┐ │ View │ 🔹 最终:View 自动刷新,无需手动调用任何方法 │ (界面) │ └───────────────┘ 

可视化深度解析

  1. 核心符号:╍双向绑定╍ 是 MVVM 的灵魂,代表'数据驱动'——View 与 ViewModel 共享一份数据模型,一方变化,另一方自动更新,无需手动调用 SetData()/Refresh() 等方法;
  2. 层级逻辑:'上↔中→下→中↔上',View 与 ViewModel 是'平等的双向数据关联',而非'控制与被控制';
  3. 角色边界:
    • View:'数据展示容器',仅通过绑定语法关联 ViewModel 数据,无任何业务/展示逻辑;
    • ViewModel:'View 专属适配器',封装 View 所需数据(如将 DateTime 转 string)、处理 View 触发的命令(如 QueryCommand),但不依赖 View;
    • Model:职责与 MVC/MVP 一致,仅处理数据。

执行流程

  1. 用户在 View 输入查询条件(如输入框输入'2024');
  2. 双向绑定生效,输入框的内容自动同步到 ViewModel 的 QueryCondition 属性;
  3. ViewModel 的 QueryCommand 命令触发,调用 Model 执行查询(如按'2024'查数据);
  4. Model 返回原始数据给 ViewModel;
  5. ViewModel 将原始数据转为 View 可绑定的格式(如 List<ShowData>),更新自身 DataList 属性;
  6. 双向绑定生效,ViewModel 的 DataList 变化自动同步到 View 的表格控件,View 自动刷新展示。

核心特点

  • 无手动同步代码:无需写 View.SetData()/ViewModel.Refresh(),数据变化自动同步;
  • 解耦最彻底:View 与 ViewModel 完全独立(View 只用绑定语法,不知道 ViewModel 内部逻辑;ViewModel 不引用 View);
  • 开发效率最高:省去大量'数据赋值、界面刷新'的样板代码;
  • 适用场景:Vue、React、小程序、WPF、Blazor、MAUI(数据驱动型界面)。

6. 三者最强对比(可视化 + 深度总结)

架构核心可视化符号中间层角色View 自主性解耦程度核心优势适用场景
MVC单向箭头 →中转者高(自主展示)中(View-C 耦合高)经典、适配 Web 单向请求ASP.NET MVC、Spring MVC
MVP双向接口 ↕控制者零(被动展示)高(接口解耦)易测试、View 可替换WinForm、Android/iOS 原生
MVVM双向绑定 ╍╍╍适配器零(自动展示)极高(完全独立)开发快、无样板代码Vue、React、WPF、小程序

极简可视化对比

MVC
V → C → M ↑ │ └───────┘ 

核心:中转式单向流转,View 自主渲染

MVP
V ↔ P → M 

核心:接口式双向控制,View 被动渲染

MVVM
V ↔ VM → M 双向绑定 

核心:数据式双向同步,View 自动渲染


7. 总结(面试/学习必背)

  1. 设计本质:三者都是'分层解耦',区别在于'中间层的角色'和'View 与中间层的交互方式';
  2. 选择逻辑:
    • 做 Web 后端:优先 MVC;
    • 做桌面/原生 APP:优先 MVP;
    • 做前端/跨平台:优先 MVVM;
  3. 核心记忆点:
    • MVC:Controller 中转,View 自己画;
    • MVP:Presenter 指挥,View 照着画;
    • MVVM:数据自己动,View 自动画。

目录

  1. MVC、MVP、MVVM 架构详解
  2. 1. 前言
  3. 2. 三大核心角色统一说明
  4. 3. MVC 架构(Model-View-Controller)
  5. 定位
  6. 🎨 可视化图画(深度解析版)
  7. 可视化深度解析
  8. 执行流程
  9. 核心特点
  10. 4. MVP 架构(Model-View-Presenter)
  11. 定位
  12. 🎨 可视化图画(深度解析版)
  13. 可视化深度解析
  14. 执行流程
  15. 核心特点
  16. 5. MVVM 架构(Model-View-ViewModel)
  17. 定位
  18. 🎨 可视化图画(深度解析版)
  19. 可视化深度解析
  20. 执行流程
  21. 核心特点
  22. 6. 三者最强对比(可视化 + 深度总结)
  23. 极简可视化对比
  24. MVC
  25. MVP
  26. MVVM
  27. 7. 总结(面试/学习必背)

更多推荐文章

查看全部
  • Ubuntu 22.04 安装 MySQL 5.7 完整指南
  • 【2026必看 AI智能体】零基础Coze平台使用教程
  • AI 代码助手(GitHub Copilot)如何改变开发者工作流
  • GPT-4o 为何免费开放?技术突破与商业逻辑解析
  • 前端监控实践:错误、性能与用户行为追踪
  • Python 在 CentOS 系统上的深度部署指南
  • 基于 Protege、Neo4j 与 ECharts 的教育领域知识图谱可视化实战
  • x64 与 ARM64 架构解析:如何识别并选择正确的安装包
  • Mars-Admin 基于 Spring Boot 3 + Vue 3 + UniApp 的管理系统
  • Python 数据可视化:Seaborn 库使用指南
  • Python 模块基础:导入、自定义与包管理
  • 基于 Vivado 的 AD9680 FPGA 测试程序开发:1G 采样与 JESD204B 接收
  • 现代 C++ 任务并行编程系统:Taskflow 详解
  • Spring Boot 优雅停机演进:实现原理与最佳实践
  • Java 对象比较详解:基本类型与自定义类实现
  • webdav-server 轻量级 WebDAV 服务器部署与配置指南
  • 九联 UNT413A 刷机全流程解析与避坑
  • AirSim 无人机仿真入门:实现起飞与降落控制
  • Spring Boot 日志实战:级别、持久化与 SLF4J 配置指南
  • PowerWiki:基于 Git 的知识管理系统

相关免费在线工具

  • Keycode 信息

    查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online

  • Escape 与 Native 编解码

    JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online

  • JavaScript / HTML 格式化

    使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online

  • JavaScript 压缩与混淆

    Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online