MVC、MVP和MVVM的区别

MVC、MVP、MVVM 架构模式对比

1. MVC (Model-View-Controller)

架构图

复制代码
┌─────────┐    ┌───────────┐    ┌──────┐
│   View  │───►│Controller │───►│ Model│
└─────────┘    └───────────┘    └──────┘
     ▲                              │
     └──────────────────────────────┘

通信流程

  1. 用户操作 View 触发事件
  2. View 调用 Controller 处理用户输入
  3. Controller 操作 Model 更新数据
  4. Model 数据变化后直接通知 View 更新
  5. View 从 Model 获取最新数据并刷新显示

特点

  • View 知道 Model 的存在,直接监听 Model 变化
  • Controller 相对薄,主要职责是路由和协调

代码示例

typescript 复制代码
// Model - 数据和业务逻辑
class UserModel {
    constructor(public name: string, public email: string) {}
    
    updateUser(name: string, email: string) {
        this.name = name;
        this.email = email;
    }
}

// View - 用户界面
class UserView {
    displayUser(user: UserModel) {
     // Model 更新后会自动通知 View
        console.log(`Name: ${user.name}, Email: ${user.email}`);
    }
}

// Controller - 协调者
class UserController {
    constructor(private model: UserModel, private view: UserView) {}
    
    handleUserUpdate(name: string, email: string) {
        this.model.updateUser(name, email);   
    }
}

2. MVP (Model-View-Presenter)

架构图

通信流程

  1. 用户操作 View 触发事件
  2. View 调用 Presenter 处理用户输入
  3. Presenter 操作 Model 更新数据
  4. Model 返回结果给 Presenter
  5. Presenter 手动更新 View 的状态和显示

特点

  • View 与 Model 完全解耦,彼此不知道对方的存在
  • Presenter 较厚,包含大量的展示逻辑
  • 单向数据流,所有通信都通过 Presenter 中转

代码示例

typescript 复制代码
// View 接口
interface IUserView {
    showUserName(name: string): void;
    showUserEmail(email: string): void;
    showLoading(): void;
    hideLoading(): void;
}

// Presenter - 展示逻辑
class UserPresenter {
    constructor(private model: UserModel, private view: IUserView) {}
    
    onLoadUser() {
        this.view.showLoading();
        // 从 Model 获取数据
        const userData = this.model.getUserData();
        // 手动更新 View
        this.view.showUserName(userData.name);
        this.view.showUserEmail(userData.email);
        this.view.hideLoading();
    }
    
    onUpdateUser(name: string, email: string) {
        this.model.updateUser(name, email);
        // 手动同步到 View
        this.view.showUserName(name);
        this.view.showUserEmail(email);
    }
}

3. MVVM (Model-View-ViewModel)

架构图

通信流程

  1. View 通过数据绑定自动反映 ViewModel 的状态
  2. 用户操作触发 ViewModel 的命令
  3. ViewModel 操作 Model 更新数据
  4. Model 更新后,ViewModel 状态自动变化
  5. View 通过双向绑定自动更新显示

特点

  • 双向数据绑定是核心机制
  • ViewModel 不知道 View 的存在,完全解耦
  • 声明式编程

代码示例

typescript 复制代码
// View (使用数据绑定)
 <input v-model="userName">

对比总结

特性 MVC MVP MVVM
View 职责 展示数据,监听 Model 展示数据,转发用户输入 展示,通过绑定自动更新
中间层职责 Controller:路由协调 Presenter:展示逻辑 ViewModel:视图状态管理
数据流向 双向(View↔Controller↔Model) 单向(View→Presenter→Model→Presenter→View) 双向自动绑定
View 与 Model 关系 View 知道 Model 完全解耦 通过 ViewModel 间接连接

关键区别总结

  • 依赖方向:MVC 中 View 依赖 Model,MVP 中 View 和 Model 完全隔离,MVVM 中 View 依赖 ViewModel

参考文章:MVC,MVP 和 MVVM 的图示

相关推荐
事圆则缓9 小时前
MVC、MVP、MVVM、MVI 的区别与实现原理
android·kotlin·mvc
Zzzzmo_1 天前
Spring MVC
java·spring·mvc·cookie/session
Mr.敦的私房菜1 天前
【SpringBoot请求记录】Spring Boot Actuator 自定义记录 HTTP 服务请求
spring boot·mvc·运维开发
MetaLite9 天前
Spring-MVC微服务接口怎么分层-网关Controller与Service边界
spring·微服务·mvc
李昊哲小课11 天前
SpringMVC 完整执行流程
spring boot·spring·mvc
小小龙学IT17 天前
Qt 模型/视图框架(Model/View)深度解析:从 MVC 演化到数据展示架构的王者
qt·架构·mvc
树码小子18 天前
什么是大语言模型
人工智能·语言模型·mvc
evans在进步18 天前
Spring MVC 核心机制详解:全局异常处理、请求跳转与数据绑定
java·spring·mvc
小林ixn19 天前
NestJS 入门实战:从 0 到 1 撸一个 Todo CRUD,感受装饰器与模块化的优雅
后端·mvc·nestjs
breeze jiang19 天前
NestJS MVC 实战:用 hello 项目 7 个文件讲清分层、装饰器、依赖注入与错误处理
node.js·mvc·js