自学教程 学编程从这里开始

MVC模式

《MVC模式》|架构模式

关键词:Model、View、Controller、关注点分离、架构分层、单向/双向数据流

一、什么是MVC模式

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

核心意图
把数据、展示、用户交互控制三者解耦。数据逻辑独立于页面渲染;视图只负责展示,不处理业务;控制器接收用户输入,调度模型与视图。

三层职责

  1. Model(模型)

    管理应用数据、业务规则、状态。不关心视图和控制器。当数据发生变化时,通知视图更新(观察者模式思想)。

    包含实体、领域逻辑、数据持久化(DB/缓存)。
  2. View(视图)

    负责展示数据,渲染页面/UI。只从Model读取数据,不修改业务数据。不处理用户业务逻辑。
  3. Controller(控制器)

    接收用户输入(点击、表单、请求),将请求转化为对Model的操作;控制视图渲染。作为View与Model之间的中间人。

经典MVC数据流:
用户操作 → View → Controller → 修改Model → Model变更通知View刷新

二、UML结构图

角色划分:

  1. Model:维护数据与业务,提供数据查询,状态变更通知View
  2. View:展示Model数据,转发用户操作到Controller
  3. 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 变种说明(容易混淆)

  1. 经典桌面端MVC(Smalltalk原始版本)

    View 直接感知 Model;Model变更主动推送View更新。Controller 绑定View事件。
  2. Java Web MVC(SpringMVC)

    浏览器请求 → Controller → Model → 返回View(模板)渲染。

    View不感知Model,由Controller把数据传给View,是Web改良版MVC。
  3. MVP:Presenter替代Controller;View和Model完全隔离,Presenter双向同步。
  4. MVVM:ViewModel,双向绑定(前端Vue/Angular)。

五、优缺点总结

✅ 优点

  1. 关注点分离,三层职责单一,便于分层开发、测试
  2. Model复用:同一套业务模型,可以给多个不同视图使用
  3. 视图和业务解耦,UI变更不改动业务代码
  4. 便于单元测试:Model、Controller可以脱离UI单独测试

❌ 缺点

  1. 增加项目结构复杂度;简单小项目会显得笨重
  2. 多层跳转,理解成本上升
  3. Web版本MVC容易出现Controller膨胀,承担过多逻辑
  4. 原始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 条笔记