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

MVC与MVP设计模式

MVC模式 (Model-View-Controller)

基本概念

MVC是一种将应用程序分为三个核心组件的设计模式:

  • Model(模型): 负责数据和业务逻辑

  • View(视图): 负责显示数据和用户界面

  • Controller(控制器): 处理用户输入并更新模型和视图

交互流程

┌─────────┐    ┌───────────┐    ┌──────┐
│   View  │ ←→ │ Controller│ ←→ │ Model│
└─────────┘    └───────────┘    └──────┘↑                              │└──────────────────────────────┘
  1. 用户与View交互(如点击按钮)

  2. View将用户操作传递给Controller

  3. Controller处理输入,可能需要更新Model

  4. Model更新后通知View(通常通过观察者模式)

  5. View从Model获取最新数据并更新显示

特点

  • View和Model之间存在直接通信

  • Controller相对较轻,主要作为中介

  • 常用于Web框架如Spring MVC、Ruby on Rails等

MVP模式 (Model-View-Presenter)

基本概念

MVP是MVC的变体,主要区别在于:

  • Presenter取代了Controller

  • View和Model完全解耦

交互流程

┌──────┐    ┌───────────┐    ┌──────┐
│ View │ ←→ │ Presenter │ ←→ │ Model│
└──────┘    └───────────┘    └──────┘
  1. 用户与View交互

  2. View将事件委托给Presenter

  3. Presenter处理业务逻辑,可能需要更新Model

  4. Model更新后通知Presenter(不是直接通知View)

  5. Presenter从Model获取数据并更新View

特点

  • View和Model完全分离,通过Presenter通信

  • Presenter比Controller更重,包含更多展示逻辑

  • View通常是被动的,只负责显示

  • 常用于桌面应用和Android开发

关键区别图示

MVC:
┌──────┐       ┌───────────┐       ┌──────┐
│ View │ ←───→ │Controller │ ←───→ │ Model│
└──────┘       └───────────┘       └──────┘↑                                 │└─────────────────────────────────┘MVP:
┌──────┐       ┌───────────┐       ┌──────┐
│ View │ ←───→ │Presenter  │ ←───→ │ Model│
└──────┘       └───────────┘       └──────┘
(无直接View-Model通信)

优缺点比较

MVC优点

  • 结构简单直接

  • 开发速度快

  • 适合小型到中型应用

MVC缺点

  • View和Model耦合

  • 大型应用中Controller可能变得臃肿

  • 单元测试较困难

MVP优点

  • 更好的关注点分离

  • 更易于单元测试

  • View和Model完全解耦

  • 适合复杂UI逻辑

MVP缺点

  • 需要更多样板代码

  • Presenter可能变得复杂

  • 学习曲线略高

实际应用示例

MVC示例(Web应用)

// Model
public class User {private String name;// getters/setters
}// View (JSP)
<html><body>Hello ${user.name}</body></html>// Controller
@Controller
public class UserController {@GetMapping("/user")public String getUser(Model model) {model.addAttribute("user", new User("Alice"));return "userView";}
}

MVP示例(Android)

// Model
public class User {private String name;// getters/setters
}// View接口
public interface UserView {void showUserName(String name);
}// Presenter
public class UserPresenter {private UserView view;private User user;public UserPresenter(UserView view) {this.view = view;this.user = new User("Bob");}public void loadUser() {view.showUserName(user.getName());}
}// Activity实现View接口
public class UserActivity extends AppCompatActivity implements UserView {private UserPresenter presenter;protected void onCreate(Bundle b) {presenter = new UserPresenter(this);presenter.loadUser();}public void showUserName(String name) {textView.setText(name);}
}

http://www.xdnf.cn/news/229573.html

相关文章:

  • 数据接收全流程图(物理网卡 → 应用层)
  • 第16篇:Linux设备驱动程序入门<三>
  • 自定义项目中导入文件import顺序
  • 前端 - 冷加载和热加载有什么区别?
  • DeepSeek谈《凤凰项目 一个IT运维的传奇故事》
  • 设计模式(构建者模式)
  • 【计算机视觉】图像分割:Segment Anything (SAM):通用图像分割的范式革命
  • 芯知识|WT2000T录音芯片应用会议录音设备解析:高保真降噪与低功耗兼得
  • 安卓基础(Looper和Handler)
  • React 第三十六节 Router 中 useParams 的具体使用及详细介绍
  • Docker搜索镜像报错
  • OpenCV 图形API(76)图像与通道拼接函数-----对输入图像进行归一化操作函数normalize()
  • OpenCV的grabCut算法分割图像
  • 六、UI自动化测试06--PO设计模式
  • QT—布局管理器之QStackedLayout篇
  • UE5 项目迁移 注意事项记录
  • 永磁同步电机控制算法--线性ADRC转速环控制器(一阶、二阶)
  • canvas动画:点随机运动 距离内自动连接成线 鼠标移动自动吸附附近的点
  • Q2(流动式)起重机司机理论考试精选题及答案
  • 2025年5月计划(Ue4.0shader源码抄写+ue独立游戏每天一小节)
  • 《多端统一的终极答案:X5内核增强版的渲染优化全解析》
  • 微调 LLaMA 2:定制大型语言模型的分步指南
  • Linux 部署以paddle Serving 的方式部署 PaddleOCR CPU版本
  • 虚拟机对前端开发的实用价值:提升效率与解决痛点的完整指南
  • Nanote:极简Markdown笔记应用
  • React Native 从零开始完整教程(环境配置 → 国内镜像加速 → 运行项目)
  • LeetCode 1295.统计位数为偶数的数字:模拟
  • Arduino IDE中更新esp32 3.2.0版本的办法
  • 开源协议全解析:类型、选择与法律风险规避指南
  • Sigmoid函数简介及其Python实现