什么是 MVC 模式?
MVC 模式
MVC(Model-View-Controller) 是一种软件架构模式,通过将应用划分为三个核心组件实现关注点分离,由 Trygve Reenskaug 于 1979 年在 Smalltalk 项目中提出,是 Web 框架最经典的架构范式。
一、三大核心组件
| 组件 | 职责 | 典型技术 |
|---|---|---|
| Model(模型) | 数据与业务逻辑 | ORM、实体类、Service |
| View(视图) | 用户界面展示 | HTML、模板引擎、前端组件 |
| Controller(控制器) | 协调请求、调用 Model、选 View | 路由处理函数、Servlet |
1. Model(模型)
- 封装数据状态与业务规则
- 不依赖 View 和 Controller(可独立测试、复用)
- 数据变更时通知 View 更新(观察者模式)
▼python复制代码class Article: def __init__(self, title, content): self.title = title self.content = content def publish(self): self.is_published = True self.published_at = datetime.now()
2. View(视图)
- 负责渲染展示层,从 Model 取数据
- 不含业务逻辑,只做格式化呈现
- 监听 Model 变化自动刷新
▼html复制代码<!-- view.html --> <h1>{{ article.title }}</h1> <p>{{ article.content }}</p>
3. Controller(控制器)
- 接收用户请求,解析参数
- 调用 Model 执行业务逻辑
- 选择合适的 View 渲染响应
▼python复制代码def article_detail(request, article_id): article = Article.get(article_id) # 调 Model return render('view.html', {'article': article}) # 选 View
二、数据流向
▼text复制代码用户 → Controller(解析请求) ↓ Model(业务逻辑 + 数据) ↓ View(渲染) ↓ 用户(响应)
经典 MVC 是双向的:View 监听 Model 变化自动更新(观察者模式)。Web 环境因 HTTP 无状态,演变为单向请求-响应流。
三、MVC 的核心价值
| 价值 | 说明 |
|---|---|
| 关注点分离 | 数据、展示、控制各司其职 |
| 可维护性 | 修改 View 不影响 Model,反之亦然 |
| 可测试性 | Model 可脱离 UI 独立单元测试 |
| 复用性 | 同一 Model 可对接 Web / API / CLI 多种 View |
| 团队协作 | 前端改 View、后端改 Model、路由改 Controller 互不干扰 |
四、Web MVC 的变体
1. 经典 MVC(桌面/Smalltalk 原版)
▼text复制代码View ←→ Model(观察者,双向同步) Controller → Model Controller → View
2. Web MVC(Model 2,请求-响应单向)
▼text复制代码Request → Controller → Model → View → Response
View 不再监听 Model,每次请求重新渲染。Spring MVC、ASP.NET MVC 属此模式。
3. MVP(Model-View-Presenter)
▼text复制代码View ←→ Presenter ←→ Model
Presenter 充当中间人,View 与 Model 完全隔离,Presenter 通过接口操作 View。Android 早期常用。
4. MVVM(Model-View-ViewModel)
▼text复制代码View ←双向绑定→ ViewModel ←→ Model
ViewModel 暴露数据与命令,View 通过双向数据绑定自动同步。Vue、WPF、Knockout 属此模式。
五、各框架的 MVC 实现
| 框架 | Model | View | Controller |
|---|---|---|---|
| Spring MVC | JavaBean / JPA Entity | JSP / Thymeleaf | @Controller 注解类 |
| Ruby on Rails | ActiveRecord 类 | .erb 模板 | ApplicationController |
| ASP.NET MVC | DbContext 实体 | Razor .cshtml | Controller 类 |
| Laravel | Eloquent Model | Blade 模板 | Controller 类 |
| Django | models.Model | Template(DTL) | View 函数/类(实为 Controller 角色) |
六、MVC 的争议与局限
1. "MVC 已死"之争
- Massive View Controller:Controller 易臃肿(iOS 经典痛点)
- 边界模糊:业务逻辑到底放 Model 还是 Controller?
- 过度分层:简单 CRUD 强行 MVC 显得繁琐
2. 现代演进
- 前后端分离:后端只提供 API(无 View 层),前端 SPA 自管 MVC/MVVM
- DDD 分层:用 Domain / Application / Infrastructure 替代传统 MVC
- 微服务:每个服务内部 MVC,对外只暴露 API
七、MVC vs MVT(Django)
Django 自称 MVT,本质是 MVC 的变体:
| MVC | Django MVT | 说明 |
|---|---|---|
| Model | Model | 一致,ORM 映射数据 |
| View | Template | Django 的 Template 承担 MVC 的 View 展示职责 |
| Controller | View | Django 的 View 函数承担 MVC 的 Controller 控制职责 |
| — | URL Dispatcher | Django 自身充当路由分发(Controller 的入口) |
▼python复制代码# Django 的 "View" 实际是 MVC 的 Controller def article_detail(request, pk): # Controller 角色 article = Article.objects.get(pk=pk) # 调 Model return render(request, 'detail.html', {'article': article}) # 选 Template(View)
八、何时选择 MVC
| 适合 | 不太适合 |
|---|---|
| 中大型 Web 应用 | 极简静态页面 |
| 需要长期维护的项目 | 一次性脚本 |
| 团队分工明确 | 单人快速原型 |
| 多端复用同一 Model | 纯 API 微服务(用更轻架构) |
一句话总结:MVC 是将应用分为 Model(数据与业务)、View(展示)、Controller(协调) 三层以实现关注点分离的经典架构模式,核心价值是可维护、可测试、可复用,Web 框架普遍采用其变体(Model 2 单向流),Django 的 MVT 是 MVC 的换名变体(View 当 Controller、Template 当 View),现代前后端分离与 DDD 是 MVC 的进一步演进。
评论
问答助学
相关内容
0个评论
全部评论
点击登录,快来和大家讨论吧~
表情
图片
暂无评论
