Android MVP:什么是 Interactor?

什么是交互者?它如何适应MVP设计?与将交互器代码放在演示器中相比,使用交互器的优点/缺点是什么?


答案 1

在撰写本文时(2016年),许多项目都是使用MVC模式的错误版本编写的。其中活动/片段/控制器具有太多代码行。这个问题通常被称为神的活动。MVP 越来越受欢迎,通过将类解耦为模型、视图和表示器来解决此问题。

但MVP本身还不够,我们还看到交互器和存储库模式的出现。

什么是交互者?它如何适应MVP设计?

您可以将交互组件视为创建、读取、更新和删除 (CRUD) 模型的“Util”类。交互者将从存储库的数据库、Web 服务或任何其他数据源中提取数据。交互器是获取模型的“动词”或“操作”。

  • 获取用户
  • 更新配置文件
  • 删除状态
  • 等等..

获取数据后,交互者会将数据发送给演示者。演示者决定何时或如何使用模型在 UI 中进行更改。

使用交互器意味着业务逻辑是分离的。因为它是解耦的;代码是可重用的,更简单的,可测试的。

与将交互器代码放在演示器中相比,使用交互器的优点/缺点是什么?

您可以将“交互器代码”放在演示器中,例如,如果您确信代码足够简单,则不需要将其提取到单独的类中。但是,如果您决定使用交互器,则可以在其他演示器上重用该交互器。

存储库呢?

存储库是负责 CRUD 操作(如连接到数据库)的实现详细信息的类。

存储库包含用于获取模型的实现详细信息。

class UserRepository {
    fun connectToDb() {}
    fun getUser(): User {}
}

有些人称之为数据源,但我相信这些术语是可以互换的。

更新(2021):即使MVP +交互器仍然有用。带有Android Jetpack的MVVM模式是Google首选的UI模式。


答案 2

交互器是将域层与表示层分开的类。简单来说,它提供了与用于操作UI的代码(通过将数据绑定到UI /动画/导航)分开编写业务逻辑的方法。

因此,Interactor 是 Presenter/ViewModel 和 Repository 模式之间的中介。

我没有在MVP中使用过交互器模式,但我在MVVM中使用它。交互器可以互换用于用例。

例如,让我们以获取要在列表中显示的类别的用例为例(在下面的示例中,表示器表示MVP,ViewModel表示MVVM模式)。

  • View(Activity/Fragment)将调用 Presenter/ViewModel 的方法来获取 categoryList。
  • 然后,Presenter/ViewModel 将调用 interactor 的方法来获取 categoryList。
  • 交互者将调用存储库的(CategoryRepository)方法来获取categoryList。
  • 存储库将具有逻辑来决定是从 Web 服务(远程数据源)还是从数据库存储(本地数据源)或从缓存(临时存储 - 在存储库类中可变)获取类别。
  • 存储库将类别列表(从所选数据源获取)返回给交互器
  • 交互器将在categoryList上处理(一些格式等)并将其发送到Prefester/ViewModel。交互者可以直接将列表发送到演示者/视图模型,如果不需要处理
  • Presenter/ViewModel 将调用 View 的方法,并将 categoryList 作为参数
  • 视图将显示类别列表,带或不带动画

请注意,在此过程中可以避免交互器,因此无需使用像存储库>Interactor>Presenter/ViewModel这样的数据流,而是可以通过存储库>Presenter/ViewModel以这种方式进行通信。在这里,演示者/视图模型将成为演示以及域层的一部分。就像我上面说的,Interactor充当这两层的分隔符。

这些是一些简明扼要的博客来解释这个概念以供参考

我希望这将有助于您以更好的方式理解交互者的角色。快乐编码!!!


推荐