gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 21:01:24 27 4
gpt4 key购买 nike

我正在尝试根据 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com