Android MVP:什么是交互器?

Android MVP: What is an Interactor?

什么是交互器?它如何融入 MVP 设计? advantages/disadvantages 使用交互器与将交互器代码放在演示器中有什么区别?

Interactor 包含应用程序的用例,这意味着它将包含项目业务领域的所有实现。

这里有一篇关于Architecturing Android Applications, using the MVP pattern.的文章,非常有条理,我强烈推荐你学习。

在撰写本文时(2016 年),许多项目都是使用错误版本的 MVC 模式编写的。 Activity/Fragment/Controller 的代码行太多。这个问题俗称神Activity。 MVP 越来越受欢迎,它通过将 class 与模型、视图和演示者解耦来解决这个问题。

但 MVP 本身还不够,我们还看到了 Interactor 和 Repository 模式的出现。

What is an Interactor? How does it fit within the MVP Design?

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

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

Interactor获取数据后,将数据发送给Presenter。演示者决定何时或如何使用模型来更改您的 UI。

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

What are the advantages/disadvantages of using an interactor vs putting the interactor code in the presenter?

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

存储库呢?

存储库 class 负责 CRUD 操作的实现细节,例如连接到数据库。

存储库包含获取模型的实现细节。

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

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

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

我个人使用的 View、Present 和 Interactor 对我来说与模型不同。

您可以将 Interactor 视为 class,具有从数据库、服务器等检索数据的有用方法。获得数据后,您可以在 Interactor 中填充模型并将其返回给 Presenter。

您可以有一个 LoginInteractor,它创建一个 Asynctask 来验证用户,然后用接收到的数据填充 UserModel。

Interactor 是一个 class,它将域层与表示层分开。 简而言之,它提供了与用于操作 UI 的代码分开编写业务逻辑的方法(通过将数据绑定到 UI/动画/导航)。

因此交互器是 Presenter/ViewModel 和存储库模式之间的中介。

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

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

  • View(Activity/Fragment)会调用Presenter/ViewModel的方法获取categoryList。
  • 然后Presenter/ViewModel会调用interactor的方法得到categoryList
  • Interactor会调用Repository的(CategoryRepository)方法获取categoryList
  • Repository 将有逻辑来决定是从 Web 服务(远程数据源)还是从 DB 存储(本地数据源)或缓存(临时存储 - 可以在 Repository class 中可变)获取类别.
  • Repository 将 return categoryList(从选定的数据源中获取)到 Interactor
  • Interactor 将处理 categoryList(某些格式等)并将其发送到 Presenter/ViewModel。 Interactor如果不需要处理可以直接发送列表到Presenter/ViewModel
  • Presenter/ViewModel 将以 categoryList 作为参数调用 View 的方法
  • 视图将显示带或不带动画的类别列表

请注意,在此过程中可以避免Interactor,因此可以使用Repository->Interactor->Presenter/ViewModel这样的数据流来进行通信通过Repository->Presenter/ViewModel这种方式。这里 Presenter/ViewModel 将是 Presentation 和 Domain 层的一部分。就像我上面说的,Interactor 充当这两层的分隔符。

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

希望本文能帮助您更好地理解 Interactor 的作用。快乐编码!!!