MVC、MVP和MVVM这三种设计模式的区别

详谈MVC、MVP 和 MVVM

  • MVC、MVP 和 MVVM 这三种设计模式的区别
    • 1. 角色职责
    • 2. 数据绑定
    • 3. 性能和可测试性
    • 4. 复杂性
    • 5. 技术依赖
    • 6. 综合比较
  • 总结
  • 如何选择

MVC、MVP 和 MVVM 这三种设计模式的区别

1. 角色职责

  • MVC
    • 模型(Model):负责数据处理和业务逻辑,直接与数据库或数据源交互
    • 视图(View):负责用户界面的展示和用户交互
    • 控制器(Controller):Controller 接收用户输入并处理用户请求,协调 Model 和 View 之间的交互 更新模型和视图

概念: MVC 是最古老也是最基础的设计模式之一


特点: 控制器是核心,负责接收用户输入并调用模型和视图进行相应操作;视图和模型之间存在直接联系,模型数据改变时,视图自动更新;适用于多变的用户界面和复杂的交互逻辑。

  • 优点:结构清晰,易于理解,适合团队协作
  • 缺点:随着应用复杂度增加,Controller 可能会变得过于庞大,且 View 和 Model 之间有时会有紧密耦合 难以维护
  • MVP
    • 模型(Model):负责数据处理和业务逻辑
    • 视图(View):负责展示和渲染视图,不包含任何业务逻辑,通过接口与Presenter通信
    • 表示器(Presenter):Presenter 作为中间人,负责处理用户交互,调用 Model层 更新数据 并通知 View层 更新显示

概念: MVP是对MVC的一种改进,旨在进一步降低视图和模型之间的耦合。
具体解释: 在MVP中 ,Presenter层完全将View层和Model层进行了分离,把主要程序逻辑放在Presenter层实现,Presenter与具体的View层(Activity)是没有直接的关联,是通过定义接口来进行交互的,从而使得当View层(Activity)发生改变时,Persenter依然可以保持不变。View层接口类只应该只有set/get方法,及一些界面显示内容和用户输入,除此之外不应该有多余的内容。绝不允许View层直接访问Model层,这是与MVC最大区别之处,也是MVP核心优点。


特点: 视图和模型之间没有直接联系,都是通过Presenter进行通信;视图是被动的,只负责展示,不包含业务逻辑和事件处理;可以更容易地进行单元测试,因为业务逻辑都在Presenter中,而不是在视图中。

  • 优点: 视图与业务逻辑分开 提高了可测试性,因为Presenter可以独立于视图进行单元测试。
  • 缺点:代码量增加,特别是Presenter和View之间的接口定义可能变得臃肿,而且在某些情况下可能会出现大量的数据绑定代码
  • MVVM
    • 模型(Model):负责数据处理和业务逻辑
    • 视图(View):负责视图的展示和用户交互 通过数据绑定直接与ViewModel交互
    • 视图模型(ViewModel):ViewModel 作为 Model 和 View 之间的桥梁,负责提供视图所需的数据和操作;是视图的抽象,封装了视图的状态和行为,通常会暴露可绑定的属性和命令,View通过数据绑定(data binding)与ViewModel绑定

概念: MVVM由微软提出,主要用于WPF和Silverlight平台,后来被广泛应用于其他技术栈中。
具体解释: MVVM 模式在 MVP 模式的基础上进一步演进,引入了 ViewModel 组件。在 MVVM 模式中,视图(View)通过数据绑定技术直接与 ViewModel 进行交互,而不需要显式的引用和调用 Presenter。ViewModel 负责管理视图需要的数据,并处理与视图状态相关的逻辑和操作。值得注意的是,ViewModel 不直接与视图交互,而是通过数据绑定将数据的变化自动反映到视图上。


特点: 视图直接绑定到ViewModel, ViewModel通过通知机制(如属性更改通知)更新视图;提高了代码的可测试性和可维护性;视图与业务逻辑解耦,使得视图层更加简洁,仅关注呈现;常用于现代前端框架和工具,例如Angular、React(使用State代替ViewModel的角色)、Vue等。

  • 优点:利用数据绑定简化了UI更新逻辑,提高了开发效率,视图与业务逻辑高度解耦 易于维护和测试
  • 缺点:依赖于数据绑定机制,学习曲线相对陡峭,特别是在大型项目中管理ViewModel可能会变得复杂

2. 数据绑定

  • MVC:通常没有内置的数据绑定机制,数据的更新需要手动更新视图。
  • MVP:通常也没有内置的数据绑定机制,Presenter 将数据从 Model 获取后,手动更新视图。
  • MVVM:具有内置的数据绑定机制,ViewModel 将数据从 Model 中获取后,自动更新视图。

3. 性能和可测试性

  • MVC:Controller 的逻辑较重,因此可能导致 Controller 过于庞大、难以维护和测试的问题。
  • MVP:将逻辑集中在 Presenter 中,使得逻辑层适当解耦,提高了可测试性和可维护性。
  • MVVM:通过数据绑定机制实现了视图和数据之间的解耦,有助于提高性能、可测试性和可维护性。

4. 复杂性

MVVM 通常被比 MVC 和 MVP 更复杂,因为 ViewModel 提供了额外的抽象层

5. 技术依赖

  • MVC:不依赖特定的技术,可以根据需求和平台进行灵活的实现。
  • MVP:通常与特定的框架(如Android中的MVP模式)或技术(如数据绑定框架)相关
  • MVVM:通常与特定的框架(如AngularJS、Vue.js等)或技术(如数据绑定框架)相关联

6. 综合比较

特征MVCMVPMVVM
复杂性中等
可测试性中等
可维护性中等
灵活度中等

总结

  • MVC更侧重于通过控制器来协调,适合需要灵活控制流程的应用
  • MVP通过Presenter强化了视图和模型的分离,提高了测试性,但可能引入更多架构复杂度
  • MVVM利用数据绑定简化了视图与数据的同步,特别适合现代富客户端应用和SPA(单页面应用),但依赖于数据绑定支持

如何选择

  • MVC:适用于具有少量视图和相对简单的数据模型的简单、直接的应用程序。
  • MVP:适用于具有更复杂数据模型和更多视图的应用程序或需要高可测试性和可维护性的应用程序。
  • MVVM:适用于具有大型、复杂数据模型以及高度数据绑定和命令要求的应用程序。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/46971.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【算法】LRU缓存

难度:中等 题目: 请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。 实现 LRUCache 类: LRUCache(int capacity) 以 正整数 作为容量 capacity 初始化 LRU 缓存int get(int key) 如果关键字 key 存在于缓存中,…

多级表头固定列问题

父级的width,是需要固定的列的width的总和 参考: el-table 多级表头下对应列的固定

1.3Zygote

Zygote 是 Android 系统中一个关键的进程,负责快速创建新应用进程。它的名字来源于生物学中的“合子”,象征着它是所有应用进程的起源。以下是对 Zygote 的详细解析: Zygote 的作用 预加载: Zygote 在系统启动时预加载了一些常用…

JAVA零基础学习1(CMD、JDK、环境变量、变量和键盘键入、IDEA)

JAVA零基础学习1(CMD、JDK、环境变量、变量和键盘键入、IDEA) CMD常见命令配置环境变量JDK的下载和安装变量变量的声明和初始化声明变量初始化变量 变量的类型变量的作用域变量命名规则示例代码 键盘键入使用 Scanner 类读取输入步骤示例代码 常用方法处…

HBuilder X3.4版本中使用uni-app自定义组件

HBuilder X3.4版本中使用uni-app自定义组件 这是我的小程序页面结构 方式一&#xff1a;导入components 1.创建componets文件&#xff0c;并编写你的组件页面 <template><view class"my-search-container"><!-- 使用 view 组件模拟 input 输入框的样…

无人机区域常见名词

融合空域 是指有其他航空器同时运行的空域。 隔离空域 是指专门分配给无人机系统运行的空域&#xff0c;通过限制其他航空器的进入以规避碰撞风险。 人口稠密区 是指城镇、村庄、繁忙道路或大型露天集会场所等区域。 重点地区 是指军事重地、核电站和行政中心等关乎国家…

前端学习常用技术栈

前端基础&#xff1a;HTML、CSS、JavaScript 前端高级&#xff1a;HTML5、CSS3、JavaScript 语法规范&#xff1a;TypeScript、ECMAScrpit、Eslint、Prettier 前端热门框架&#xff1a;Vue.js、React.js、Angular.js、Bootstrap、Nuxt.js、Svelte.js、Solid.js、Preact.js、Tai…

LintcCode 468 · 对称二叉树【简单 二叉树 递归 Java】

题目 题目链接&#xff1a; https://www.lintcode.com/problem/468/description?showListFetrue&page1&problemTypeId2&tagIds371&orderingid&pageSize50 思路 递归 Java代码 /*** Definition of TreeNode:* public class TreeNode {* public int…

厂家置换电费如何达到最大化收益

新能源行业知识体系-------主目录-----持续更新https://blog.csdn.net/grd_java/article/details/140004020 文章目录 一、电能电费二、同时刻不同厂家置换&#xff0c;不会影响最终电能电费结果三、风险防范补偿和回收机制四、我们的数据如何考虑补偿和回收五、如何利用补偿和…

蓝桥杯14小白月赛题解

直接输出pi/ti,for遍历 #include <iostream> using namespace std; #define int long long int a,b,c ; double t1.00; signed main() {cin>>a;int an0;for(int i1;i<a;i){cin>>b>>c;if(t>c*1.00/b){tc*1.00/b;ani;} }cout<<an<<e…

服务器上有多个nginx,如何知道启动的是哪个?

根据网上查的方案和自己总结的目前是有三种 方案1&#xff1a;链接: 服务器上有多个nginx&#xff0c;如何知道启动的是哪个&#xff1f; 首先ps -ef | grep nginx&#xff0c;获取个pid lsof -p pid&#xff0c;根据输出可以看到启动这个pid的路径&#xff0c;即可知道是哪个…

【车载开发系列】GIT教程---如何使用GUI来提交变更

【车载开发系列】GIT教程—如何使用GUI来提交变更 GIT教程---如何使用GUI来提交变更 【车载开发系列】GIT教程---如何使用GUI来提交变更一. 使用Git GUI的好处二. 使用GUI克隆出一个已有仓库 一. 使用Git GUI的好处 在软件开发中&#xff0c;Git通常用于管理和操作版本控制系统…

linux-arm ubuntu18.04 qmqtt5.12.6 编译部署

安装 qt 查看qt 版本 &#xff1a; qmake -v 下载对应版本 qmqtt 解压下载的mqtt文件 进入qmqtt xxx/src 目录 在qt 安装目录中创建QtMqtt文件夹&#xff0c; &#xff0d; x86平台qt 默认目录为 /usr/include/x86_64-linux-gnu/qt5 &#xff0d; arm平台qt 默认目录为/us…

Python 从PDF中提取图片和图片信息(坐标、宽度和高度等)

目录 使用工具 Python从PDF的特定页面中提取图片 Python从PDF文档中提取图片 Python从PDF中提取图片的坐标、宽度和高度等信息 PDF文件作为一种广泛使用的电子文档格式&#xff0c;不仅包含文字信息&#xff0c;还可能包含各种图片、图表等视觉元素。在某些场景下&#xff…

【Linux】安装PHP扩展-Swoole

说明 本文档是在centos7.6的环境下&#xff0c;安装PHP7.4之后&#xff0c;安装对应的PHP扩展Swoole。 一、swoole简述 Swoole 是一个为 PHP 设计的高性能的异步并行网络通信引擎&#xff0c;它以扩展&#xff08;extension&#xff09;的形式存在&#xff0c;极大地提升了 …

zephyr设置BLE广播数据实例

目录 实例1&#xff1a;静态开启广播数据实例2&#xff1a;动态更改广播数据实例3&#xff1a;创建可连接的广播 实例1&#xff1a;静态开启广播数据 新建一个hello world的工程模板。 在prj.conf中开启蓝牙 CONFIG_BTy这个宏&#xff0c;默认会开启广播支持 ( BT_BROADCAS…

Spring Boot项目的404是如何发生的

问题 在日常开发中&#xff0c;假如我们访问一个Sping容器中并不存在的路径&#xff0c;通常会返回404的报错&#xff0c;具体原因是什么呢&#xff1f; 结论 错误的访问会调用两次DispatcherServlet&#xff1a;第一次调用无法找到对应路径时&#xff0c;会给Response设置一个…

TCP与UDP的理解

文章目录 UDP协议UDP协议的特点UDP的应用以及杂项 TCP协议TCP协议段格式解释和TCP过程详解确认应答机制 -- 序号和确认序号以及6位标志位中的ACK超时重传机制连接管理机制 与标志位SYN,FIN,ACK滑动窗口流量控制拥塞控制延迟应答捎带应答和面向字节流粘包问题TCP异常情况TCP特点…

5.4 软件工程-系统设计

系统设计 - 概述 设计软件系统总体结构 数据结构及数据库设计 编写概要设计文档、评审 详细设计的基本任务 真题

【LeetCode】插入区间

目录 一、题目二、解法完整代码 一、题目 给你一个 无重叠的 &#xff0c;按照区间起始端点排序的区间列表 intervals&#xff0c;其中 intervals[i] [starti, endi] 表示第 i 个区间的开始和结束&#xff0c;并且 intervals 按照 starti 升序排列。同样给定一个区间 newInte…