在 Java 中,让 class A 在 class B 中发生事件时,在 class B 不知道 class A 存在的情况下做某事的最佳方法是什么?

In Java, what's the best way to make class A do something when an event happens in class B without class B knowing of class A's existence?

我正在制作一个小游戏,我有一个 PlayScreen,它有一个 GameWorld,它有一个 Player。现在,每当 Player 触摸传送块时,我都会调暗 PlayScreen,然后 Player 传送,然后 PlayScreen 再次变亮。

目前,为了实现这一点,我向播放器添加了一个 boolean inTeleportAnimation。然后 PlayScreen 检查 update() 内的每一帧,如果 Player 处于传送动画中,如果是,它开始使屏幕变暗。现在这看起来很好,因为它只检查 1 boolean/trigger。但稍后可能会有很多不同的触发器让 PlayScreen 做一些事情(例如调暗屏幕)。让 playScreen.update() 每帧检查每个 trigger/boolean 可能不是一个好主意,因为这意味着我需要为每个可能的触发器添加另一个 if 语句。我也不想让 PlayScreen 和 Player 的关系成为双向的。

实现此目标的最佳或"correct"方法是什么?

我会利用observer design pattern来解决这个任务。它应该解决您想要避免双向耦合的问题,因为 PlayScreen(在本例中为观察者)会根据需要通知 Player(在本例中为可观察者)的更改,但不会参考,或与播放器的任何其他类型的紧密耦合。

如果您正在使用 Java,正如此 post 的标签所示,这里有一个 simple example in Java 应该用于演示其用途。

如果您的播放器设置了一个全局标志,每当播放器发生更新时该标志就会打开(例如,当设置了 inTeleportAnimation 时,该标志也会被设置,其他标志也一样)并且在 PlayScreen.update() 处理更新,这样 Player 就不知道 PlayScreen 并且您可以避免在每一帧中进行不必要的检查。但是我没有看到避免对每个条件进行检查的方法(假设全局标志指示更新)。