在游戏的规则模块中,我有很多类似这样的代码:
public boolean isGameWon(Board board) {
for (Point point : board.getTargetPoints())
if(!(board.getTopSpriteAt(point) instanceof Box))
return false;
return true;
}
更新:如果每个“Target”上面都有一个“Box”,则
//Do something
将计数。我不明白如何只通过在Sprite中添加doSomething()
来完成这项任务,除非doSomething()
返回1(如果精灵是箱子);否则返回0(这与instanceof完全相同)。我知道instanceof被认为是有害的,因为它破坏了面向对象编程的思想。
然而,在我的情况下,我不确定如何修复代码。以下是我想到的一些想法:
- 我不认为只是在“Sprite”接口中简单添加一个
isABox()
方法会使问题变得更好。
- 如果“Box”是一个接口,那么其他类是否可以获得相同的特权?
- 我是否应该尝试像访问者模式那样使用模式匹配/双重调度之类的花哨技巧?
- 规则模块是否可以与类型密切合作,因为它本来就应该了解它们的语义?
- 规则模块策略模式的整个思想是否有缺陷?
- 将规则构建到Sprites中是没有意义的,因为当添加新类型时,所有Sprites都必须更改。希望你已经尝试过类似的事情,并能指导我正确的方向。