《MVC模式》|架构模式
关键词:Model、View、Controller、关注点分离、架构分层、单向/双向数据流
一、什么是MVC模式
MVC(Model-View-Controller) 是一种架构模式,将应用拆分为三层职责:模型(Model)、视图(View)、控制器(Controller),实现关注点分离。
MVC不属于GOF23种面向对象设计模式;它是高层应用级别的架构方案,内部可以组合使用GOF设计模式(观察者、策略、命令等)。

核心意图
把数据、展示、用户交互控制三者解耦。数据逻辑独立于页面渲染;视图只负责展示,不处理业务;控制器接收用户输入,调度模型与视图。
三层职责
- Model(模型)
管理应用数据、业务规则、状态。不关心视图和控制器。当数据发生变化时,通知视图更新(观察者模式思想)。
包含实体、领域逻辑、数据持久化(DB/缓存)。 - View(视图)
负责展示数据,渲染页面/UI。只从Model读取数据,不修改业务数据。不处理用户业务逻辑。 - Controller(控制器)
接收用户输入(点击、表单、请求),将请求转化为对Model的操作;控制视图渲染。作为View与Model之间的中间人。
经典MVC数据流:
用户操作 → View → Controller → 修改Model → Model变更通知View刷新
二、UML结构图
角色划分:
- Model:维护数据与业务,提供数据查询,状态变更通知View
- View:展示Model数据,转发用户操作到Controller
- Controller:接收View的用户请求,调用Model方法,控制视图

三、Java Web 简易示例(经典后端MVC)
简易模拟 Servlet MVC,不引入框架,演示分层职责
Model
public class User {
private Integer id;
private String name;
public User(Integer id, String name) {
this.id = id;
this.name = name;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
// Model service
public class UserModel {
public User findUserById(Integer id) {
// simulate DB query
return new User(id, "User_" + id);
}
}
Controller
public class UserController {
private UserModel userModel;
public UserController(UserModel userModel) {
this.userModel = userModel;
}
public User getUserInfo(Integer userId) {
return userModel.findUserById(userId);
}
}
View(模拟JSP视图,只负责输出展示)
public class UserView {
public void render(User user) {
System.out.println("==== User View Render ====");
System.out.println("UserId: " + user.getId());
System.out.println("UserName: " + user.getName());
}
}
Client(模拟前端请求入口)
public class Client {
public static void main(String[] args) {
UserModel model = new UserModel();
UserController controller = new UserController(model);
UserView view = new UserView();
User user = controller.getUserInfo(1001);
view.render(user);
}
}
运行输出:
==== User View Render ====
UserId: 1001
UserName: User_1001
四、MVC 变种说明(容易混淆)
- 经典桌面端MVC(Smalltalk原始版本)
View 直接感知 Model;Model变更主动推送View更新。Controller 绑定View事件。 - Java Web MVC(SpringMVC)
浏览器请求 → Controller → Model → 返回View(模板)渲染。
View不感知Model,由Controller把数据传给View,是Web改良版MVC。 - MVP:Presenter替代Controller;View和Model完全隔离,Presenter双向同步。
- MVVM:ViewModel,双向绑定(前端Vue/Angular)。
五、优缺点总结
✅ 优点
- 关注点分离,三层职责单一,便于分层开发、测试
- Model复用:同一套业务模型,可以给多个不同视图使用
- 视图和业务解耦,UI变更不改动业务代码
- 便于单元测试:Model、Controller可以脱离UI单独测试
❌ 缺点
- 增加项目结构复杂度;简单小项目会显得笨重
- 多层跳转,理解成本上升
- Web版本MVC容易出现Controller膨胀,承担过多逻辑
- 原始MVC中Model对View的通知,会带来一定耦合
六、框架源码应用
- Spring MVC(后端最典型MVC框架)
- Struts1 / Struts2
- Swing(桌面原始MVC思想)
- Ruby on Rails
七、MVC vs GOF23设计模式对比
| 对比项 | MVC模式 | GOF23设计模式 |
|---|---|---|
| 分类 | 架构模式 | 类/对象级别设计模式 |
| 粒度 | 整个应用/模块高层结构 | 组件内部对象协作 |
| 作用 | 划分应用模块职责 | 解决类之间通信、算法、实例创建等局部问题 |
| 关系 | MVC内部可以使用GOF模式(观察者、策略等) | 不包含MVC |
八、小结
MVC核心:数据交给Model,页面渲染交给View,用户交互调度交给Controller,三层分离,关注点隔离。
注意区分:MVC是架构模式,不属于GOF23;日常后端开发SpringMVC是改良Web版MVC,和Smalltalk原始MVC数据流略有差异。
0 条笔记