循环依赖 - 总是错的?

时间:2011-09-27 21:51:22

标签: java oop swing sockets cyclic-reference

1.我想知道以下结构是否不正确,原因是什么,以及解决方案是什么: 假设我已经实现了网络游戏的客户端 客户有2个主要包:
A.GUI - 保持所有摆动Jpanels等 B.LogicEngine

在Logic引擎中,我有一个名为clientThread的类,其主要目标是与服务器通信以获取在Gui Panel上执行的命令,以及由于Gui Panels上的用户选择而发回信息。< / p>

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

3.在面向对象编程问题上执行要在Gui上显示的内容,如同客户端线程一样负责以某种方式管理游戏流程,尽管它在逻辑引擎包上?

4.如果Gui部分知道并使用逻辑部分这是一个问题吗?

想听听一些建议 非常感谢你

2 个答案:

答案 0 :(得分:8)

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

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

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

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

最后,从逻辑线程操作GUI没有任何问题,无论你必须知道event dispatching thread

答案 1 :(得分:5)

  1. 我会添加第三个元素。我会有GUI,LogicEngine和Communication包。通过这种方式,您可以使用文件,本地数据库或模拟类进行测试。逻辑和套接字不属于一体。它们只是彼此的输入和输出。
  2. 我个人对GUI的逻辑一无所知。 GUI的作业只存在于调用逻辑中。 GUI不知道是谁或什么调用它,也不关心。这就是微波炉不关心我使用它还是我的妻子的原因。
  3. 我不太明白这个问题。你能改一下吗?
  4. 不,反过来就是问题所在。 GUI存在,因此用户可以操纵逻辑。当逻辑依赖于GUI时,会发生不好的事情。