当前位置: 首页 > news >正文

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 相对薄,主要职责是路由和协调

代码示例

// 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 更新后会自动通知 Viewconsole.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 中转

代码示例

// 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();// 手动更新 Viewthis.view.showUserName(userData.name);this.view.showUserEmail(userData.email);this.view.hideLoading();}onUpdateUser(name: string, email: string) {this.model.updateUser(name, email);// 手动同步到 Viewthis.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 的存在,完全解耦
  • 声明式编程

代码示例

// View (使用数据绑定)<input v-model="userName">

对比总结

特性MVCMVPMVVM
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 的图示

http://www.dtcms.com/a/482808.html

相关文章:

  • wordpress文章页面菜单泉州网站建设方案优化
  • Git代码下拉更新推送操作用法整理
  • 西安做网站的公司wordpress 调试php代码
  • 用C++实现一个高效可扩展的行为树(Behavior Tree)框架
  • 3Dockerfile镜像制作,镜像分层机制
  • 【Linux】Linux工具漫谈:yum 与 vim,高效操作的 “左膀右臂”
  • 网站免费优化网站推广运作怎么做
  • 【从零开始java学习|第二十三篇】泛型体系与通配符
  • 有哪些做室内设计好用的网站wordpress+chrome+扩展
  • CRMEB多商户系统(PHP)v3.3正式发布,同城配送上线[特殊字符]
  • Flink 作业通用优化方案
  • deepseek改写的dlx算法求解数独rust程序
  • Leetcode 3715. Sum of Perfect Square Ancestors
  • 四川省建设厅门户网站男女做床网站
  • 语义循环的幽灵——循环解释悖论对NLP深层语义分析的影响与启示
  • 项目沟通与冲突管理
  • 网站引导页案例免费的制作手机网站平台
  • linux学习笔记(32)网络编程——UDP
  • 2025全新三防平板科普:5G-A+卫星通信+国产化
  • 电商网站建设懂你所需wordpress一句话木马
  • 「机器学习笔记14」集成学习全面解析:从Bagging到Boosting的Python实战指南
  • 小迪安全v2023学习笔记(一百三十一讲)—— Web权限提升篇划分获取资产服务后台系统数据库管理相互转移
  • Java高并发知识
  • 2025年渗透测试面试题总结-204(题目+回答)
  • 复制 201/220 Dump 需要用什么?
  • idc网站备案中国与菲律宾最新事件
  • 深圳网站建设公司首选宜昌营销型网站
  • 美丽乡村 村级网站建设网站 繁体 js
  • Git 大文件上传失败深度解析与终极解决方案_含 macOS_Windows 全流程20251014
  • Starting again myself 03