我正在尝试根据 Uncle Bob's Clean Architecture 进行设计在安卓中。
问题:
我想解决的是如何使在一个存储库中生成的更改反射(reflect)在应用程序的其他部分,例如其他存储库或 View 。
示例
我为此示例设计了一个非常简化的示例。请注意,边界接口(interface)已被移除以保持图表较小。
想象一个显示视频列表(带有标题、缩略图和点赞数)的应用,点击视频可以查看详细信息(您可以在此处点赞/不点赞视频)。
此外,该应用还有一个统计系统,可以统计用户喜欢或不喜欢的视频数量。
这个应用程序的主要类可能是:
目标
现在假设您检查了自己的统计数据,然后浏览视频列表,打开其中的详细信息,然后单击“赞”按钮。
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)。
事件监听器
在您的应用程序中,受事件影响的所有组件现在都可以监听域事件。
在您的特定示例中,VideoDetailView
或 StatsRepository
可能是 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/