Android MVP:啥是交互器?
Posted
技术标签:
【中文标题】Android MVP:啥是交互器?【英文标题】:Android MVP: What is an Interactor?Android MVP:什么是交互器? 【发布时间】:2016-06-15 06:23:12 【问题描述】:什么是交互器?它如何适应 MVP 设计?使用交互器与将交互器代码放在演示器中的优点/缺点是什么?
【问题讨论】:
简而言之,Interactor 就像与 Model 进行通信所需的语言。如果您需要从其他来源(例如数据库或网络)获取一些数据(模型),则需要使用 Interactor 连接到它。否则,如果您的 Presenter 不需要此类数据,则不需要 Model 和 Interactor。将 Interactor 代码放在 Presenter 中是不好的,原因与将 Presenter 代码放在 View 中的原因相同:关注点分离、可测试性、可维护性和可扩展性:digigene.com/android-architecture-part3-mvp-wolfkcats2 【参考方案1】:在撰写本文时(2016 年),许多项目都是使用不良版本的 MVC 模式编写的。 Activity/Fragment/Controller 的代码行太多。这个问题通常被称为上帝活动。 MVP 通过将类与 Model、View 和 Presenter 解耦来解决这个问题越来越受欢迎。
但 MVP 本身还不够,我们还看到了交互器和存储库模式的出现。
什么是交互器?它如何适应 MVP 设计?
您可以将交互器视为创建、读取、更新和删除 (CRUD) 模型的“Util”类。交互器将从存储库中从您的数据库、Web 服务或任何其他数据源中获取数据。 Interactor 是获取模型的“动词”或“动作”。
获取用户 更新配置文件 删除状态 等等..interactor拿到数据后,会将数据发送给presenter。演示者决定何时或如何使用模型对 UI 进行更改。
使用交互器意味着业务逻辑是解耦的。因为它是解耦的;代码可重用、更简单且可测试。
使用交互器与将交互器代码放在演示器中的优点/缺点是什么?
您可以将“交互代码”放在演示器中,例如,如果您确信代码足够简单,不需要将其提取到单独的类中。但如果您决定使用交互器,则交互器可以在其他演示者上重用。
存储库呢?
存储库是负责 CRUD 操作的实现细节的类,例如连接到数据库。
存储库包含获取模型的实现细节。
class UserRepository
fun connectToDb()
fun getUser(): User
有些人称之为数据源,但我相信这些术语是可以互换的。
更新(2021 年): 尽管 MVP + Interactor 仍然有用。带有 Android Jetpack 的 MVVM 模式是 Google 的首选 UI 模式。
【讨论】:
一个明确的答案。用 RxJava 替换 Interactor 是否可行或更好? @JiaqiLiu 有可能,但并不总是(或更好)。你不需要 RxJava 来使用 Interactor。像任何其他库一样,RxJava 只是一个工具。找到适合您需求的最佳工具。如果你有很多并发,那么使用 RxJava。 “交互者”与 MVP 无关。它也可以在 MVVM 中使用【参考方案2】:Interactor 是一个将领域层与表示层分开的类。 简而言之,它提供了单独编写业务逻辑的方法,而不是用于操作 UI 的代码(通过将数据绑定到 UI/动画/导航)。
所以 Interactor 是 Presenter/ViewModel 和 Repository 模式之间的中介。
我没有在 MVP 中使用交互器模式,但我在 MVVM 中使用过它。交互器可以互换地用于用例。
例如,让我们以获取类别以显示在列表中的用例为例(在下面的示例中,Presenter 代表 MVP,ViewModel 代表 MVVM 模式)。
View(Activity/Fragment)会调用Presenter/ViewModel的方法来获取categoryList。 然后Presenter/ViewModel会调用interactor的方法获取categoryList Interactor会调用Repository的(CategoryRepository)方法获取categoryList 存储库将有逻辑来决定是从 Web 服务(远程数据源)还是从数据库存储(本地数据源)或缓存(临时存储 - 可以在存储库类中更改)获取类别。 Repository 会将 categoryList(从选定的数据源获取)返回给 Interactor Interactor 将处理 categoryList(一些格式等)并将其发送到 Presenter/ViewModel。如果不需要处理,Interactor 可以直接向 Presenter/ViewModel 发送列表 Presenter/ViewModel 将以 categoryList 为参数调用 View 的方法 View 将显示 categoryList 带或不带动画请注意,在这个过程中可以避免使用Interactor,因此可以通过Repository->进行通信,而不是使用像Repository->Interactor->Presenter/ViewModel这样的数据流Presenter/ViewModel 这样。这里 Presenter/ViewModel 将成为 Presentation 和 Domain 层的一部分。就像我上面说的那样,Interactor 充当这两层的分隔符。
这些是一些简洁的博客来解释这个概念以供参考
clean-architecture-with-mvvmi android-mvp-architecture-extension-with-interactor architecting-android-the-clean-way我希望这将帮助您更好地理解交互者的角色。快乐编码!!!
【讨论】:
你先生,应该获得奖章。 @silwar 链接android-mvp-architecture-extension-with-interactor
已损坏...它甚至看起来都不像一个有效的 HTTP 链接...
@SebasSBM 感谢您引起我的注意。我现在改变了链接。请检查。快乐编码:)
很棒的解释和参考,谢谢!!【参考方案3】:
Interactor 包含应用程序的用例,这意味着它将包含项目业务领域的所有实现。
这是Architecturing Android Applications, using the MVP pattern. 上一篇组织得很好的文章,我强烈推荐你学习。
【讨论】:
这对我来说似乎不太清楚。阅读那篇文章实际上是引发这个问题的原因 - 通俗地说“业务领域的实现”是什么意思? @bkach 据我了解,有一个接口定义了业务将做什么,例如银行,您将使用以下方法创建一个接口,例如取款、转账、存款等。现在您可能有这个接口的实现,可以说取决于客户端?或者按照业务规则的规定。但我可能是错的。 抱歉,他隐藏了“JuicyInsta”。 先生,您的 gihub 存储库链接显示Page no Found
。请检查【参考方案4】:
我个人使用与模型不同的 View、Present 和 Interactor。
您可以将交互器视为一个具有从数据库、服务器等检索数据的有用方法的类。获得数据后,您可以在 Interactor 中填充模型并将其返回给 Presenter。
例如您可以使用 LoginInteractor 创建 Asynctask 来验证用户身份,然后使用接收到的数据填充 UserModel。
【讨论】:
以上是关于Android MVP:啥是交互器?的主要内容,如果未能解决你的问题,请参考以下文章