1. 安卓运用开发中的MVC、MVP、MVVM、MVI

安卓运用开发是一个热门而又杂乱的范畴,跟着技能的不断进步和需求的不断改变,安卓运用开发也需求不断地优化和改进。为了提高安卓运用开发的效率和质量,规划形式是一个重要而又必不可少的东西。规划形式能够协助咱们将程序分解为不同的模块,完成模块内部的高内聚和模块之间的低耦合,然后提高代码的可读性、可维护性、可扩展性和可测验性。

在安卓运用开发中,最常见和最盛行的规划形式有四种:MVC(Model-View-Controller)、MVP(Model-View-Presenter)、MVVM(Model-View-ViewModel)和MVI(Model-View-Intent)。这四种规划形式都是基于分层架构思维,将程序分为三层:数据层(Model)、视图层(View)和逻辑层(Controller/Presenter/ViewModel/Intent)。数据层担任办理数据状况和供给数据接口;视图层担任展现用户界面和接纳用户输入;逻辑层担任处理事务逻辑和操控数据与视图之间的交互。

虽然这四种规划形式都遵循了分层架构思维,但它们在详细完成上有着不同之处。本文将从以下几个方面比照这四种规划形式:

  • 模块之间的通讯办法
  • 模块之间的依靠联系
  • 模块之间的责任区分
  • 优缺陷剖析
  • 适用场景

1.1 MVC

1.1.1 模块之间的通讯办法

在MVC规划形式中,视图层直接与操控器层进行双向通讯,操控器层与数据层进行单向通讯。如下图所示:

当用户对视图进行操作时,视图会将事情传递给操控器;操控器依据事情类型调用相应的事务逻辑,并更新数据;数据改变后会告诉操控器;操控器再依据数据改变更新视图。

1.1.2 模块之间的依靠联系

在MVC规划形式中,视图依靠于操控器,操控器依靠于数据。如下图所示:

因为视图直接与操控器进行双向通讯,导致视图与操控器严密耦合。假如需求修正或替换其间一个组件,则需求一起修正或替换另一个组件。

1.1.3 模块之间的责任区分

在MVC规划形式中,数据层担任办理数据状况和供给数据接口;视图层担任展现用户界面和接纳用户输入;操控器层担任处理事务逻辑和操控数据与视图之间的交互。

数据层:通常是一个Java Bean类,封装了运用程序的核心数据,如用户信息、商品信息等。数据层能够从本地或长途获取或存储数据,并供给相应的办法供操控器调用。
视图层:通常是一个XML布局文件,界说了运用程序的用户界面,如按钮、文本框等。视图层能够响运用户的操作,并将事情传递给操控器。
操控器层:通常是一个Activity或Fragment类,完成了运用程序的事务逻辑,如登录、注册、购物等。操控器层能够依据视图传来的事情调用相应的数据办法,并依据数据改变更新视图。
1.1.4 优缺陷剖析
MVC规划形式是最早也是最简略的一种分层架构思维,它有以下长处:

简略易懂,容易上手
将程序分为三个模块,完成了一定程度上的解耦
有利于代码复用和维护
但MVC规划形式也有以下缺陷:

视图与操控器严密耦合,不利于测验和扩展
操控器过于臃肿,承当了太多责任
数据改变后需求手动更新视图
###1.1.5 适用场景
MVC规划形式适合于简略小型的安卓运用开发,当事务逻辑不杂乱且视图改变不频频时,能够运用MVC规划形式快速开发出可运行的运用。

##1.2 MVP
###1.2.1 模块之间的通讯办法
在MVP规划形式中,视图层与逻辑层进行双向通讯,逻辑层与数据层进行单向通讯。如下图所示:

当用户对视图进行操作时,视图会将事情传递给逻辑层;逻辑层依据事情类型调用相应的事务逻辑,并更新数据;数据改变后会告诉逻辑层;逻辑层再依据数据改变更新视图。

###1.2.2 模块之间的依靠联系
在MVP规划形式中,视图依靠于接口(View Interface),而不是详细完成(Presenter);同样地,逻辑层也依靠于接口(Model Interface),而不是详细完成(Model)。如下图所示:

因为视图和逻辑层都经过接口进行通讯,导致视图和逻辑层松散耦合。假如需求修正或替换其间一个组件,则不需求一起修正或替换另一个组件。

###1.2.3 模块之间的责任区分
在MVP规划形式中,数据层担任办理数据状况和供给数据接口;视图层担任展现用户界面和接纳用户输入;逻辑层担任处理事务逻辑和操控数据与视图之间的交互。

数据层:与MVC规划形式中的数据层相同,通常是一个Java Bean类,封装了运用程序的核心数据,如用户信息、商品信息等。数据层能够从本地或长途获取或存储数据,并供给相应的办法供逻辑层调用。
视图层:与MVC规划形式中的视图层类似,通常是一个XML布局文件,界说了运用程序的用户界面,如按钮、文本框等。但不同的是,视图层不直接与逻辑层进行通讯,而是经过界说一个View Interface接口来标准视图与逻辑之间的交互。View Interface接口界说了一些笼统办法,如showLoading()、showError()、showData()等,由详细的Activity或Fragment类来完成这些办法,并将本身作为参数传给Presenter类。
逻辑层:与MVC规划形式中的操控器层类似,通常是一个Presenter类,完成了运用程序的事务逻辑,如登录、注册、购物等。但不同的是,逻辑层不直接与视图层进行通讯,而是经过界说一个Model Interface接口来标准逻辑与数据之间的交互。Model Interface接口界说了一些笼统办法,如login()、register()、buy()等,由详细的Model类来完成这些办法,并将结果回调给Presenter类。Presenter类在构造函数中接纳一个View Interface类型的参数,并经过调用该参数的办法来更新视图。

###1.2.4 优缺陷剖析
MVP规划形式是对MVC规划形式的改进,它有以下长处:

视图与逻辑层松散耦合,利于测验和扩展
逻辑层愈加清晰,责任愈加单一
数据改变后能够主动更新视图
但MVP规划形式也有以下缺陷:

需求界说多个接口,增加了代码量和杂乱度
视图与逻辑层仍然存在双向通讯,不利于数据流的追寻和办理
###1.2.5 适用场景
MVP规划形式适合于中等杂乱度的安卓运用开发,当事务逻辑较为杂乱且视图改变较为频频时,能够运用MVP规划形式提高代码的可读性、可维护性、可扩展性和可测验性。

##1.3 MVVM
###1.3.1 模块之间的通讯办法
在MVVM规划形式中,视图层与逻辑层进行单向通讯,逻辑层与数据层进行双向通讯。如下图所示:

当用户对视图进行操作时,视图会将事情传递给逻辑层;逻辑层依据事情类型调用相应的事务逻辑,并更新数据;数据改变后会主动同步到逻辑层;逻辑层再依据数据改变主动更新视图。

###1.3.2 模块之间的依靠联系
在MVVM规划形式中,视图依靠于逻辑层(ViewModel),而不是接口(View Interface);逻辑层依靠于数据层(Model),而不是接口(Model Interface)。如下图所示:

因为视图和逻辑层之间经过数据绑定进行通讯,导致视图和逻辑层彻底解耦。假如需求修正或替换其间一个组件,则不需求一起修正或替换另一个组件。

###1.3.3 模块之间的责任区分
在MVVM规划形式中,数据层担任办理数据状况和供给数据接口;视图层担任展现用户界面和接纳用户输入;逻辑层担任处理事务逻辑和操控数据与视图之间的交互。

数据层:与MVC和MVP规划形式中的数据层相同,通常是一个Java Bean类,封装了运用程序的核心数据,如用户信息、商品信息等。数据层能够从本地或长途获取或存储数据,并供给相应的办法供逻辑层调用。
视图层:与MVC和MVP规划形式中的视图层类似,通常是一个XML布局文件,界说了运用程序的用户界面,如按钮、文本框等。但不同的是,视图层不直接与逻辑层进行通讯,而是经过运用Data Binding库来完成视图与逻辑之间的主动同步。Data Binding库能够将XML布局文件中的UI组件与ViewModel类中的特点或办法进行绑定,并在两者之间树立一个观察者形式。当UI组件发生改变时,会主动触发ViewModel类中对应的办法;当ViewModel类中对应的特点发生改变时,会主动更新UI组件。
逻辑层:与MVC和MVP规划形式中的操控器层和Presenter层类似,通常是一个ViewModel类,完成了运用程序的事务逻辑,如登录、注册、购物等。但不同的是,逻辑层不直接与视图层进行通讯,而是经过运用LiveData库来完成逻辑与数据之间的主动同步。LiveData库能够将ViewModel类中的特点或办法与Model类中的特点或办法进行绑定,并在两者之间树立一个观察者形式。当Model类中对应的特点发生改变时,会主动更新ViewModel类中对应的特点;当ViewModel类中对应的办法被调用时,会主动调用Model类中对应的办法。

###1.3.4 优缺陷剖析
MVVM规划形式是对MVP规划形式的改进,它有以下长处:

视图与逻辑层彻底解耦,利于测验和扩展
逻辑层愈加清晰,责任愈加单一
数据改变后能够主动更新视图和逻辑
代码量更少,杂乱度更低
但MVVM规划形式也有以下缺陷:

需求运用第三方库来完成数据绑定和数据同步
数据流不易追寻和办理
###1.3.5 适用场景
MVVM规划形式适合于杂乱大型的安卓运用开发,当事务逻辑非常杂乱且视图改变非常频频时,能够运用MVVM规划形式提高代码的可读性、可维护性、可扩展性和可测验性。

##1.4 MIVI
请参阅我的另一篇文章,我想把MVI讲的详细一些。
安卓运用开发中的MVC、MVP、MVVM、MVI(2) – 简书 (jianshu.com)

##1.5 总结
本文介绍了三种常见的安卓开发规划形式:MVC、MVP和MVVM,并分别从模块之间的通讯办法、依靠联系、责任区分、优缺陷剖析和适用场景等方面进行了比较。期望本文能够协助读者理解并选择适宜的规划形式来提高安卓开发效率和质量。