Java OOP-编写游戏时避免耦合

Java OOP-编写游戏时避免耦合,java,oop,decoupling,Java,Oop,Decoupling,这是我关于堆栈溢出的第一个问题,所以请原谅我在提问中的任何错误做法(尽管我非常感谢反馈,以使我在这方面做得更好) 我目前正在做一个个人项目:一个2D战略游戏,图形最少。现在我已经完成了一个非常简单的应用程序,我决定开始实现单元测试(我使用的是JUnit),我很快意识到,考虑到我目前的设计,这将是多么痛苦 考虑一下我当前设计中的几个类:Ship、shipweapor、ShipProvider和ShipWeaponProvider。一艘船包含一个可以向其他船只开火的船用武器清单。ShipWearm是

这是我关于堆栈溢出的第一个问题,所以请原谅我在提问中的任何错误做法(尽管我非常感谢反馈,以使我在这方面做得更好)

我目前正在做一个个人项目:一个2D战略游戏,图形最少。现在我已经完成了一个非常简单的应用程序,我决定开始实现单元测试(我使用的是JUnit),我很快意识到,考虑到我目前的设计,这将是多么痛苦

考虑一下我当前设计中的几个类:Ship、shipweapor、ShipProvider和ShipWeaponProvider。一艘船包含一个可以向其他船只开火的船用武器清单。ShipWearm是一个定义特定武器特征(即伤害、精度等)的对象。ShipProvider和ShipWearmopProvider对象用于从文件加载船舶/武器定义,以便以后可以实例化(即ShipProvider.getShip(“dummyShip”)返回定义文件中定义的“dummyShip”类型的新船舶。)


当我开始尝试编写JUnit测试时,我很快意识到我自己已经陷入了一个多么痛苦的世界。船依赖于船上的武器;要测试一艘飞船,你需要一个飞船武器,飞船供应商,甚至是一个武器供应商。甚至要测试船用武器的射击方法,你也需要两艘船:一个震源(发射的船)和一个要射击的目标。对这个问题的研究表明我有一个紧耦合问题;然而,我找不到的是如何松散地耦合这组特定的类。我该怎么做呢?

谈到射击,我会说这是访问者模式()的一个例子,其中您的
船武器
是访问者,而
是接受实体


另外,为了更简单地创建
Ships
,我建议使用工厂或抽象工厂模式()

您不会为单元测试创建实际的对象,而是创建模拟,假装展示您在给定测试用例中测试的行为。看看Mockito。我有点困惑——访客模式在这里能帮我什么忙?ShipBearm只能“访问”一艘船;我没有必要去参观任何其他物体。这不是访问者模式的要点吗?(注意:我对这种特殊的设计模式缺乏经验。)