java - 清洁架构 : How to reflect the data layer's changes in the UI

标签 java android architecture coding-style

我正在尝试根据 Uncle Bob's Clean Architecture 进行设计在安卓中。

问题:

我想解决的是如何使在一个存储库中生成的更改反射(reflect)在应用程序的其他部分,例如其他存储库或 View 。

示例

我为此示例设计了一个非常简化的示例。请注意,边界接口(interface)已被移除以保持图表较小。

想象一个显示视频列表(带有标题、缩略图和点赞数)的应用,点击视频可以查看详细信息(您可以在此处点赞/不点赞视频)。

此外,该应用还有一个统计系统,可以统计用户喜欢或不喜欢的视频数量。

这个应用程序的主要类可能是:

对于视频部分/模块: enter image description here

对于统计部分/模块: enter image description here

目标

现在假设您检查了自己的统计数据,然后浏览视频列表,打开其中的详细信息,然后单击“赞”按钮。

like 发送到服务器后,应用程序的几个元素应注意更改:

  • 当然,详细 View 应该随着更改而更新(这可以通过回调来完成,所以没问题)
  • 视频列表应更新给定视频的“喜欢”计数
  • StatsRepository 可能希望在对新视频进行投票后更新/使缓存无效
  • 如果统计信息列表可见(想象一个分屏),它还应该显示更新的统计信息(或至少接收事件以重新查询数据)

问题

解决这种通信的常见模式是什么? 请尽可能完整地回答您的问题,指定事件的生成位置、它们如何通过应用程序传播等。

注意:完成答案将获得奖励

最佳答案

发布/订阅

通常,对于 n:m 通信(n 个发送者可能向 m 个接收者发送消息,而所有发送者和接收者彼此不认识),您将使用 publish/subscribe pattern . 有很多库实现了这种通信方式,例如 Java 有一个 EventBus implementation in the Guava library . 对于应用内通信,这些库通常称为 EventBus 或 EventManager 并发送/接收事件

领域事件

假设您现在创建了一个事件 VideoRatedEvent,它表示用户喜欢或不喜欢视频。 这些类型的事件称为 Domain Events .事件类是一个简单的 POJO,可能如下所示:

class VideoRatedEvent {
    /** The video that was rated */
    public Video video;
    /** The user that triggered this event */
    public User user;
    /** True if the user liked the video, false if the user disliked the video */
    public boolean liked;
}

调度事件

现在,每当您的用户喜欢或不喜欢视频时,您都需要调度 VideoRatedEvent。 使用 Guava,您只需将实例化的事件对象传递给 EventBus.post(myVideoRatedEvent) 对象。 理想情况下,事件在您的域对象中生成并在持久事务中分派(dispatch)(参见 this blog post 了解详细信息)。 这意味着当你的领域模型状态被持久化时,事件就会被分派(dispatch)。

事件监听器

在您的应用程序中,受事件影响的所有组件现在都可以监听域事件。 在您的特定示例中,VideoDetailViewStatsRepository 可能是 VideoRatedEvent 的事件监听器。 当然,您需要使用 EventBus.register(Object) 将它们注册到 Guava EventBus。

关于java - 清洁架构 : How to reflect the data layer's changes in the UI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32795712/

相关文章:

java - 使用 PDFBox 2.x 从 PDF 中提取文本时出现合并行问题

java - 最终静态变量及其使用

android - Google Play 商店更新安装计数需要多长时间

android - Android Studio无法同步Gradle项目

java - Jsoup读取图像速度很慢

rest - 如何使用不同的端点集动态创建权限组 Django Rest Framework

java - QuerySyntaxException : expecting OPEN, 在第 1 行附近找到 'DESC'

java - 将 Kotlin IntArray 转换为 ValueAnimator 所需的 Java Object[]

architecture - 每个命令的事件溯源再水合?

html - 如果我有一组随机网站,我如何从每个网站获取特定信息?