什么是 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 实现

框架ModelViewController
Spring MVCJavaBean / JPA EntityJSP / Thymeleaf@Controller 注解类
Ruby on RailsActiveRecord.erb 模板ApplicationController
ASP.NET MVCDbContext 实体Razor .cshtmlController
LaravelEloquent ModelBlade 模板Controller 类
Djangomodels.ModelTemplate(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 的变体:

MVCDjango MVT说明
ModelModel一致,ORM 映射数据
ViewTemplateDjango 的 Template 承担 MVC 的 View 展示职责
ControllerViewDjango 的 View 函数承担 MVC 的 Controller 控制职责
URL DispatcherDjango 自身充当路由分发(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个评论
点击登录,快来和大家讨论吧~
表情
图片
暂无评论
下载 APP