循环依赖 - 总是错的?

Jav*_*aSa 2 java sockets oop swing cyclic-reference

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

在Logic引擎中,我有一个名为clientThread的类,其主要目标是与服务器通信以获取在Gui Panel上执行的命令,并且还可以通过Gui Panels上的用户选择发回信息.

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

3.在面向对象编程问题上执行要在类内部显示的内容如客户端线程是错误的,客户端线程负责管理游戏流程,尽管它在逻辑引擎包上?

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

想听听一些建议
非常感谢

Tom*_*icz 8

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

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

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

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

最后,从逻辑线程操作GUI没有任何问题,无论你必须知道事件调度线程.


cor*_*iKa 5

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