MVC和MVVM以及MVP的介绍

2024-09-02 15:58
文章标签 介绍 mvc mvp mvvm

本文主要是介绍MVC和MVVM以及MVP的介绍,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言

  • 1,MVC、MVVM、MVP都属于框架模式

    • 框架是对软件进行分工,设计模式是对具体问题提出的解决方案,两者有本质的区别
  • 2.MVC模式是面向开发最常用的模式,同时也是最经典的模式

    • 其他的模式还有MTV、MVP、CBD、ORM等等很多
  • 3.所有的其他模式MVVM或者MVP都是在MVC的基础上建立的

    • MVC模式是任何模式的根源,有万变不离其宗之理
  • 4.一个项目并不是只有一个MVC和一个MVVM,而可能是每一个功能每一个界面都对应了一个MVC

    • 所以一个完整的项目是由很多个MVC和MVVM或者MVP组成的
  • 5.目前网络上的水军很多,有很多人混了一年半载开发经验,然后看了一两篇文章就觉得MVC怎么怎么不好,有说MVVM模式多么多么牛逼的,也有说MVP模式多么多么牛逼的

    • 其实这也反映了市场上很多人对框架模式的一知半解的态度
      • 笔者认为,任何一款软件都是在面对不同的功能时针对这几种模式之间有一个良好的权衡,而不是一位的偏袒某一种模式

思考题1:应用软件是由什么组成的?

  • 由展示视图的和对于的逻辑代码组成的
    • 视图对应的就是View层,逻辑代码对于的就是Model层

思考题2:视图和模型之间是直接进行交互的吗?

  • 视图和模型之间并不直接进行交互,而是通过控制器(controller)的协调来进行交互
    • 这就是MVC模式的组成结构:视图(View)、控制器(Controller)、模型(Model)

1.1-MVC模式

这里写图片描述

  • 实例:当用户点击一个按钮,请求网络数据,然后刷新当前taleview

    • 1.首先c层获取用户的点击按钮事件,然后向M层发送指令请求数据

      • 注意:此时M层请求的数据并不是直接丢给界面的tableview,而是将对象的模型M传递给C层
        • M层是通过代理来传递给C层的(网络请求类的代理或者block回调)
    • 2.C层获取到M层返回的网络数据之后,直接在C层给V层(tableview)发送刷新的指令reloadData

    • 3.当V层(tableview)想要告知C层我已经准备开始刷新了,你给我数据吧,是通过代理和数据源方法来告知的

  • MVC模式的核心就是定义了视图(view)、控制器(controller),数据(model)之间各行其道不能越界的职责

    • 可以联想到交通规则中的实线不能便道,虚线可以变道的规则
  • MVC模式的优点(由于MVC很好的分离了视图层和业务层,所以它具有以下优点)

    • 耦合度低
    • 开发速度快
    • 可维护性高
  • MVC模式的缺点

    • 由于一味地强调每一个层级之间的严格关系,当MVC三者之间,当C层需要处理的逻辑很多或者V层界面展示非常复杂的时候,就会导致某一个View文件或者Controller文件代码非常的多,甚至有四五千行代码的时候,我们维护起来就非常的麻烦。

1.2-MVVM模式

  • 此处有笔误,应该是MVVM模式下是将C层拆分成M层和V层,也就是常说的ViewModel

  • MVVM模式产生的由来就是当MVC模式下的C层代码量很多的时候将其拆分成M层和C层

    • 比如说父子控制器可以理解成是MVVM模式
    • ViewModel也是一种MVVM模式的体现,ViewModel本身是一个对象,它的内部维护了视图和视图对应的逻辑
  • MVVM模式的本质就是对MVC模式进行一个拆分,解决了MVC模式下代码臃肿的问题

  • MVVC模式的优点

    • 可复用性比MVC模式高(拆分的V和M可以被其他的mvc或者mvvm复用)
    • 耦合度低
  • MVVM模式缺点

    • 项目文件增多

1.3-MVP模式

  • MVP模式的定义

    • 作为一种新的模式,MVP与MVC有着一个重大的区别:在MVP中View并不直接使用Model,它们之间的通信是通过Presenter (MVC中的Controller)来进行的,所有的交互都发生在Presenter内部,而在MVC中View会直接从Model中读取数据而不是通过 Controller。
      • *也就是说,如果MVC模式中V不能直接访问M,就和MVP无异
  • 关于MVP模式误区的解读

    • MVP模式主要是解决MVC模式下V可以直接访问M导致耦合度很高的问题,但是根据网易公开课斯坦福大学教授的说法,MVC模式中V和M本来就是不能够进行交互的
      • 所以MVP模式的诞生个人认为是一个笑话,是对MVC模式理解的不够深刻所导致的
  • 以下是网易公开课斯坦福大学教授Paul Hegarty(世界知名级教授)讲解MVC模式的示意图

这里写图片描述

  • 视频链接http://open.163.com/special/opencourse/ios8.html

1.4-框架模式的总结

  • 所有的MVC或者MVVM模式的目的都是为了代码的解耦和易读性,MVC之间的沟通本质上还是OC的对象间消息机制的使用,以下是oc中的三种消息机制

    • 代理
    • 通知
    • kvo
  • 什么时候使用MVC,什么时候使用MVVM,这主要是由具体的业务需求所决定的

    • 业务需求很简单,控制器代码量不复杂(低于两千行代码),优先考虑MVC
    • 业务需求比较复杂,控制器代码量很多(高于两千行)或者V和M的复用性极高,可以考虑MVVM

这篇关于MVC和MVVM以及MVP的介绍的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


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

相关文章

Java中 instanceof 的用法详细介绍

《Java中instanceof的用法详细介绍》在Java中,instanceof是一个二元运算符(类型比较操作符),用于检查一个对象是否是某个特定类、接口的实例,或者是否是其子类的实例,这篇文章... 目录引言基本语法基本作用1. 检查对象是否是指定类的实例2. 检查对象是否是子类的实例3. 检查对象是否

什么是ReFS 文件系统? ntfs和refs的优缺点区别介绍

《什么是ReFS文件系统?ntfs和refs的优缺点区别介绍》最近有用户在Win11Insider的安装界面中发现,可以使用ReFS来格式化硬盘,这是不是意味着,ReFS有望在未来成为W... 数十年以来,Windows 系统一直将 NTFS 作为「内置硬盘」的默认文件系统。不过近些年来,微软还在研发一款名

C#使用StackExchange.Redis实现分布式锁的两种方式介绍

《C#使用StackExchange.Redis实现分布式锁的两种方式介绍》分布式锁在集群的架构中发挥着重要的作用,:本文主要介绍C#使用StackExchange.Redis实现分布式锁的... 目录自定义分布式锁获取锁释放锁自动续期StackExchange.Redis分布式锁获取锁释放锁自动续期分布式

IntelliJ IDEA 中配置 Spring MVC 环境的详细步骤及问题解决

《IntelliJIDEA中配置SpringMVC环境的详细步骤及问题解决》:本文主要介绍IntelliJIDEA中配置SpringMVC环境的详细步骤及问题解决,本文分步骤结合实例给大... 目录步骤 1:创建 Maven Web 项目步骤 2:添加 Spring MVC 依赖1、保存后执行2、将新的依赖

redis过期key的删除策略介绍

《redis过期key的删除策略介绍》:本文主要介绍redis过期key的删除策略,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录第一种策略:被动删除第二种策略:定期删除第三种策略:强制删除关于big key的清理UNLINK命令FLUSHALL/FLUSHDB命

Pytest多环境切换的常见方法介绍

《Pytest多环境切换的常见方法介绍》Pytest作为自动化测试的主力框架,如何实现本地、测试、预发、生产环境的灵活切换,本文总结了通过pytest框架实现自由环境切换的几种方法,大家可以根据需要进... 目录1.pytest-base-url2.hooks函数3.yml和fixture结论你是否也遇到过

MySQL中慢SQL优化的不同方式介绍

《MySQL中慢SQL优化的不同方式介绍》慢SQL的优化,主要从两个方面考虑,SQL语句本身的优化,以及数据库设计的优化,下面小编就来给大家介绍一下有哪些方式可以优化慢SQL吧... 目录避免不必要的列分页优化索引优化JOIN 的优化排序优化UNION 优化慢 SQL 的优化,主要从两个方面考虑,SQL 语

如何解决Spring MVC中响应乱码问题

《如何解决SpringMVC中响应乱码问题》:本文主要介绍如何解决SpringMVC中响应乱码问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Spring MVC最新响应中乱码解决方式以前的解决办法这是比较通用的一种方法总结Spring MVC最新响应中乱码解

Spring MVC使用视图解析的问题解读

《SpringMVC使用视图解析的问题解读》:本文主要介绍SpringMVC使用视图解析的问题解读,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Spring MVC使用视图解析1. 会使用视图解析的情况2. 不会使用视图解析的情况总结Spring MVC使用视图

C++中函数模板与类模板的简单使用及区别介绍

《C++中函数模板与类模板的简单使用及区别介绍》这篇文章介绍了C++中的模板机制,包括函数模板和类模板的概念、语法和实际应用,函数模板通过类型参数实现泛型操作,而类模板允许创建可处理多种数据类型的类,... 目录一、函数模板定义语法真实示例二、类模板三、关键区别四、注意事项 ‌在C++中,模板是实现泛型编程