【问题标题】:Cyclic dependencies- always wrong?循环依赖——总是错的?
【发布时间】:2011-11-26 10:16:04
【问题描述】:

1.我想知道下面的结构是否不正确,是什么原因,解决方法是什么: 假设我已经为网络游戏实现了一个客户端 客户端有 2 个主要包:
A.GUI - 握住所有摇摆的 Jpanels 等
B.逻辑引擎

在逻辑引擎中,我有一个名为 clientThread 的类,它的主要目标是与服务器通信以获取在 Gui 面板上执行的命令,并根据用户在 Gui 面板上的选择发送回信息..

2.为了做到这一点,我倾向于在clientThread中保存我的主Gui面板的引用,反之亦然,在两个不同项目的类之间进行循环引用是不是错了?

3.在面向对象编程的问题上,从类中执行要在 Gui 上显示的内容,比如客户端线程,尽管它在逻辑引擎包上,但它以某种方式负责管理游戏流程,这是否是错误的?

4.如果 Gui 部分知道并使用逻辑部分是否有问题?

想听听一些建议
非常感谢

【问题讨论】:

标签: java oop swing sockets cyclic-reference


【解决方案1】:

显然,GUI 应该依赖于引擎,而不是相反(而且,上帝保佑,它们不应该相互依赖)。

您的问题实际上很常见且易于解决。引擎线程应该允许客户端代码安装一个侦听器,每次发生事情时都会通知该侦听器。比 GUI 实现该侦听器并安装它。请注意,游戏逻辑引擎只知道侦听器接口,而不是位于您的 GUUI 包中的特定实现。

这是Observer 模式的实现,它有几个优点:

  • 通知代码(逻辑)没有与“感兴趣的”代码(GUI)耦合,引擎与 GUI 之间没有依赖关系
  • 您可以插入任何侦听器/观察器的实现,例如将 Swing 应用程序更改为控制台/移动/Web 应用程序,而无需对引擎进行任何更改。
  • 您可以有多个监听器,例如一个用于更新 GUI,第二个用于运行声音等。

最后,从逻辑线程操作你的 GUI 并没有错,但是你必须注意event dispatching thread

【讨论】:

  • 好吧,如果我理解正确的话。 GUI 应该持有对引擎的引用,但引擎应该通过将安装在引擎上的侦听器与 GUI 通信,并且 GUI 中的观察者可以监视这些侦听器。您是否有一些相关的示例,因为 GUI 是基于 Swing 的,并且阅读有一个 EventListener 选项可以很好地与 swing 配合使用,是正确的还是我不需要?
  • Swing 就是一个很好的例子。当你按下按钮 Swing 将运行一个与之关联的ActionListener。 Swing 按钮显然不依赖于响应按钮按下的代码。 Button 仅依赖于您正在实现的侦听器抽象接口。在您的情况下,引擎依赖于侦听器接口,而您的 GUI(窗口、框架或任何其他类)实现了该侦听器。
【解决方案2】:
  1. 我将添加第三个元素。我将拥有 GUI、LogicEngine 和通信包。通过这种方式,您可以使用文件、本地数据库或模拟类进行测试。逻辑和套接字不属于一起。它们只是彼此的输入和输出。
  2. 我个人会让逻辑对 GUI 一无所知。 GUI 的工作只是为了调用逻辑而存在。 GUI 不知道是谁或什么在调用它,它也不在乎。这与微波炉不在乎我使用它还是我的妻子的原因是一样的。
  3. 我不太明白这个问题。你能改写一下吗?
  4. 不,反之亦然是问题所在。 GUI 存在,因此用户可以操纵逻辑。当逻辑依赖于 GUI 时,就会发生不好的事情。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-12
    • 2021-10-02
    相关资源
    最近更新 更多