MVC、MVP、MVVM、MVI架构

一、MVC

MVC的基本结构
MVC(Model-View-Controller)是桌面开发中常见的软件架构。标准的MVC架构图如下:

Model(模型):负责业务数据管理和处理,包括增删改查。Model必须提供外部可以操作模型数据的接口,同时在数据发生变化后能够通知外部
View(视图):用户界面。View需要感知Model的变化,数据变化时,更新用户界面
Controller(控制器):业务逻辑层。Controller需要感知View的事件,调用Model提供的接口对数据进行操作

MVC的工作流程
1、用户对界面进行操作,触发View的相关事件;

2、View感知这些事件,通知Controller进行处理;

3、Controller处理相关业务,并通过Model的接口对业务数据进行更新;

4、Model的业务数据改变触发相应事件,通知View业务数据已经发生改变;

5、View捕获到Model发出的数据改变事件,重新获取数据并更新用户界面。
MVC的优缺点
优点:
降低用户界面与业务逻辑之间的耦合性。大大降低了用户界面和业务逻辑的耦合性,可以隔离模块间的变化,有利于维护和扩展。
复用性高。多个视图可以共享一个模型。
MVC可以将一个项目分为三个子项目分别进行开发和管理,有利于软件工程化,也可实现独立部署。
因为业务逻辑和界面的分离,为业务模块的单元测试创造了条件。

缺点:
不适合中小规模的软件项目。MVC引入了更多概念,增加了项目结构和实现的复杂性,将其应用到中小规模项目通常得不偿失。
更多的内存消耗。Model中的内容都可以从界面获取到,因此,Model的引入增加了内存消耗。
降低了程序性能。因为实现的复杂性,势必会导致性能降低。

二、MVP

MVP的基本结构
MVP(Model-View-Presenter)是从MVC演变而来的。在MVC的基础上,MVP强调Model与View之间的隔离,两者互不感知。MVP的架构图如下:

在MVP架构中,P占据主导地位,充当Model和View的桥梁,实现View和Model两者之间的隔离。
MVP的工作流程
1、用户对界面进行操作,触发View的相关事件;
2、View感知这些事件,通知Presenter进行处理;
3、Presenter处理相关业务,并通过Model的接口对业务数据进行更新;
4、Model数据变化会通知Presenter;
5、Presenter收到Model数据变化通知后,调用View暴露的接口更新用户界面。
MVP的优缺点
优点:
解耦,视图和模型完全分离,MVC常常会因为V和M的耦合性太强而渐渐导致C失去控制作用。
所有交互都在P中实现,M的设计可以更加灵活,有利于M的高效使用。

缺点:
Presente层与View层是通过接口进行交互的,交互会过于频繁,接口粒度不好控制,粒度太小,就会存在大量接口的情况,使代码太过碎版化;粒度太大,解耦效果不好。
View层与Presenter层还是有一定的耦合度,一旦视图变更了,presenter也要变更。
复杂的业务同时也会造成接口类爆炸问题。使用MVP模式去构建项目,会造成类文件和接口文件的过多,代码臃肿,进而增大包的体积

简单解决 :写一个Contract接口,然后把与MVP相关接口全部列入到里面去

可能会造成内存泄漏的问题。当用户关闭了View层,但这时Model层如果仍然在进行耗时操作,因为Presenter层也持有View层的引用,所以造成垃圾回收器无法对View层进行回收,这样一来,就造成了内存泄漏。

三、MVVM

MVVM的基本结构
MVVM(Model-View-ViewModel)也是MVC的演变而来。由微软公司提出并在WPF上大量应用。MVVM强调数据绑定,从而省去了模型数据改变后通知数据更新的步骤。MVVM的架构图如下:

Model:业务数据
View:用户界面。用户界面代码编写时,直接将M中的业务数据以声明方式绑定到对应的视图组件上。
ViewModel:核心功能有2个:1)界面渲染完成后,将声明绑定到View上的业务数据和View进行双向绑定,同步更新;2)相应View的事件,操纵M实现业务处理。

MVVM的工作流程
1、界面渲染完毕后,ViewModel会将View和Model按照开发时声明的方式进行双向绑定;
2、用户对界面进行操作,触发View的相关事件;
3、ViewModel感知View发出的事件,调用Model的接口处理业务逻辑;
4、Model内容改变,用户界面立即更新,无需额外操作。

MVVM的优缺点
优点:
解耦更彻底
开发效率高,产品开发生命周期短。通过数据双向绑定,不需要手动更新界面,实现了关注点分离,降低了开发的复杂性和工作量;
双向绑定可以通过感知模型数据的变化提前感知界面即将发生的变化,优化该过程,可以提高界面的渲染速度,避免重复渲染。
缺点:
数据绑定会消耗额外资源,占用更多的内存
数据绑定会导致模型数据的变化变得难以追踪,调试困难
数据双向绑定不利于代码重用。

也有一些MVVM框架采用单向数据绑定+UI事件劫持的方式,这里简单介绍下双绑和单绑的区别:
一般只有UI表单控件才存在双向数据绑定,非UI表单控件只有单向数据绑定。
单向数据绑定:M的变化可以自动更新到ViewModel,但ViewModel的变化需要手动更新到M(一般通过给表单控件设置事件监听实现)
双向数据绑定:M的变化可以自动更新到ViewModel,ViewModel的变化也可以自动更新到M
双向绑定=单向绑定+UI事件监听,双向和单向只不过是框架封装程度上的差异,本质上两者是可以相互转换的。
优缺点:
单向数据绑定的优点是数据更易于跟踪管理和维护,缺点是代码量较多比较啰嗦。
双向数据绑定的优点是代码量少、简洁,缺点是数据不易于跟踪管理和维护。

四、MVI

MVI基本结构
模型-视图-意图

出现的目的是为了解决MVVM中双向绑定数据的不足。把双向绑定变成单向数据流。使用Flow代替LiveData存储数据。

Model:这里的Model不是其他框架中的Model层,在MVI框架中表示存储UI的状态。
View:在MVI中View层主要是接口,负责相应UI的状态。
Intent:在MVI中Intent(和Android中的Intent不是同一个)主要负责传递UI状态。使用sealed关键字,形成一个封闭类,类似枚举。主要用于V层通知ViewModel处理数据。
State:和Intent一样是一个封闭类,主要用于ViewModel回调数据修改UI。
MVI特点
唯一可信源:数据只有一个来源(ViewModel),与MVVM思想相同
单向数据流:状态向下流动,事件向上流动。
响应式:ViewState包含页面当前状态和数据,View通过订阅
ViewState就可以完成页面刷新。相比于 MVVM 是新的特性。
优点:
1.UI的所有变化来自State,所以只需聚焦State,架构更简单、易于调试
2.数据单向流动,很容易对状态变化进行跟踪和回溯
3.State实例都是不可变的,确保线程安全
4.UI只是反应State的变化,没有额外逻辑,可以被轻松替换或复用
缺点:
1.所有的操作最终都会转换成State,所以当复杂页面的State容易膨胀
2.State是不变的,每当State需要更新时都要创建新对象替代老对象,这会带来一定内存开销

最后

如果想要成为架构师或想突破20~30K薪资范畴,那就不要局限在编码,业务,要会选型、扩展,提升编程思维。此外,良好的职业规划也很重要,学习的习惯很重要,但是最重要的还是要能持之以恒,任何不能坚持落实的计划都是空谈。

如果你没有方向,这里给大家分享一套由阿里高级架构师编写的《Android八大模块进阶笔记》,帮大家将杂乱、零散、碎片化的知识进行体系化的整理,让大家系统而高效地掌握Android开发的各个知识点。
img
相对于我们平时看的碎片化内容,这份笔记的知识点更系统化,更容易理解和记忆,是严格按照知识体系编排的。

欢迎大家一键三连支持,若需要文中资料,直接扫描文末CSDN官方认证微信卡片免费领取↓↓↓(文末还有ChatGPT机器人小福利哦,大家千万不要错过)

PS:群里还设有ChatGPT机器人,可以解答大家在工作上或者是技术上的问题

图片

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MVPMVVMMVI是三种常见的软件架构模式,用于帮助组织和管理应用程序的代码。它们的主要区别在于它们各自的组织方式和数据流。 1. MVP(Model-View-Presenter):MVP模式将应用程序划分为三个主要组件。Model负责处理数据和业务逻辑,View负责展示UI和接收用户输入,Presenter充当View和Model之间的中介,负责处理数据交互和逻辑。这种模式通常使用接口来定义View和Presenter之间的契约。 2. MVVM(Model-View-ViewModel):MVVM模式也将应用程序划分为三个主要组件。Model和View的功能类似MVP模式中的对应组件,但引入了ViewModel作为连接它们之间的中介。ViewModel通过数据绑定将视图逻辑从View中分离出来,并提供了一种方便的方式来更新视图并响应用户输入。 3. MVI(Model-View-Intent):MVI模式是一种响应式架构,它的核心思想是通过不可变的状态管理来实现。MVI模式将应用程序划分为四个主要组件。Model负责存储应用程序状态,View负责渲染UI,并将用户操作转换为Intents发送给Presenter。Presenter根据接收到的Intents处理业务逻辑,并更新Model中的状态,然后再次通知View进行UI更新。 这些架构模式都有各自的优点和适用场景。MVP模式简单直接,适合小型应用程序。MVVM模式对于复杂的UI逻辑和数据绑定非常有用。MVI模式适合需要严格控制状态变化的应用程序。选择哪种模式取决于项目的需求和团队的技术偏好。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值