设计 - 外部处理的对象状态

时间:2015-01-27 13:47:27

标签: java oop

得到了一个与设计相关的问题:

我有一个带有子类AIPlayer,HumanPlayer,NetworkPlayer等的抽象类播放器以及类GameManager。

当玩家进行移动时,会向玩家提供不同类型的牌,这些牌可以在以后的移动中使用。

我应该在哪里存储可供玩家使用的卡片?

解决方案1: 使用getter和setter方法存储在抽象类Player中。

问题,子类可以通过错误的编码意外地改变玩家拥有的牌。即问题是,当玩家的子类实际上只对GameManager可用时,setter方法可用于Player的子类 - 因为GameManager是唯一允许授予牌的类。

解决方案2: 创建不可修改的类PlayerState并在GameManager中存储从Player到PlayerState的私有映射。现在GameManager可以管理Player的状态,就像他们拥有的牌一样,但是Player的子类只能从GameManager中检索PlayerState对象,他们无法改变它。

问题,过度杀人?我的意思是玩家自己是对象,但他们使用另一个对象来获得他们的状态。

1 个答案:

答案 0 :(得分:0)

我认为这取决于你放置游戏逻辑的位置:

  • 如果大多数逻辑非常通用,那么在GameManager中,也可以更轻松地管理GameManager中每个玩家的牌。实际上,你可以在GameManager中为每个玩家维护一个私人Map,并通过将这些地图包裹在一个不可修改的地图中,使其显示为播放器及其实现,如Collections.unmodifiableMap()所示。

  • 如果大多数逻辑都是高度特定于玩家的并且与其他玩家没有太多交互,则逻辑最好放在播放器或播放器实现中。在这种情况下,您可以直接在抽象播放器中维护可修改的Set张卡片。

但请记住,如果不是在播放器中,那么你总是可以通过编码错误来解决问题。所以差异应该很小。