Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 循环依赖-总是错误的?_Java_Oop_Swing_Sockets_Cyclic Reference - Fatal编程技术网

Java 循环依赖-总是错误的?

Java 循环依赖-总是错误的?,java,oop,swing,sockets,cyclic-reference,Java,Oop,Swing,Sockets,Cyclic Reference,1.我想知道以下结构是否不正确,原因是什么,解决方法是什么: 假设我已经为网络游戏实现了一个客户端 客户端有两个主要包: A.GUI-按住所有swing JPanel等 逻辑引擎 在Logic engine中,我有一个名为clientThread的类,其主要目标是与服务器通信,以获取要在Gui面板上执行的命令,并根据用户在Gui面板上的选择将信息发送回 2.为了做到这一点,我倾向于在clientThread中保留我的主Gui面板的引用,反之亦然,在两个不同项目的类之间进行循环引用是否有错 3.在

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

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

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

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

4.此外,如果Gui部件知道并使用逻辑部件,这是一个问题吗

希望听到一些建议

非常感谢

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

你的问题其实很常见,解决起来也很简单。引擎线程应该允许客户端代码安装一个监听器,该监听器将在每次发生事件时得到通知。然后GUI实现并安装该侦听器。请注意,游戏逻辑引擎只知道侦听器接口,而不知道GUI包中的特定实现

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

  • 通知代码(逻辑)与“感兴趣的”代码(GUI)不耦合,引擎与GUI之间没有依赖关系
  • 您可以插入listener/observer的任何实现,例如将Swing应用程序更改为console/mobile/web应用程序,而无需对引擎进行任何更改
  • 您可以有多个侦听器,例如一个用于更新GUI,另一个用于运行声音,等等
最后,从逻辑线程操作GUI并没有什么错,无论您必须注意什么

  • 我想在中添加第三个元素。我会有GUI、LogicEngine和通信包。通过这种方式,您可以使用文件、本地数据库或模拟类进行测试。逻辑和套接字不属于一起。它们只是彼此的输入和输出
  • 我个人会让逻辑对GUI一无所知。GUI的任务只存在于对逻辑进行调用。GUI不知道调用它的是谁或什么,也不关心。这和微波炉不在乎我是在用它还是我妻子的原因是一样的
  • 我不太明白这个问题。你能换个说法吗
  • 不,另一方面是问题。GUI的存在使得用户可以操作逻辑。当逻辑依赖于GUI时,坏事情就会发生

  • 再看看这个,好吧,如果我没听错的话。GUI应该保存对引擎的引用,但是引擎应该通过将安装在引擎上的侦听器和GUI中的观察者与GUI通信,以监视侦听器。您是否有一些相关的例子可以这样做,因为GUI是基于Swing的,并且有一个EventListener选项可以很好地与Swing配合使用,是正确的还是我不需要它?Swing是一个很好的例子。按下按钮后,Swing将运行与其关联的
    ActionListener
    。Swing按钮显然不依赖于响应按钮按下的代码。按钮只依赖于您正在实现的侦听器抽象接口。在您的情况下,引擎依赖于侦听器接口,您的GUI(窗口、框架或任何其他类)实现该侦听器。