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

design - state of object handled externally

有一个设计相关的问题:

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

当玩家走棋时,会为玩家提供不同类型的牌,可以在以后的走棋中使用。

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

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

问题,subclass 可能会通过糟糕的编码意外更改玩家拥有的牌。即问题是 setter 方法对 Player 的子 class 可用,而实际上它应该只对 GameManager 可用 - 因为 GameManager 是唯一应该被允许的 class奖励卡片。

方案二: 创建不可修改的 class PlayerState 并在 GameManager 中存储从 Player 到 PlayerState 的私有映射。现在 GameManager 可以管理 Player 的状态,就像他们拥有的卡片一样,但是 Player 的子classes 只能从 GameManager 检索 PlayerState 对象,他们不能更改它。

问题,杀完了?我的意思是玩家本身就是对象,但他们使用另一个对象来获取状态。

我认为这取决于你把游戏逻辑放在哪里:

  • 如果大部分逻辑都非常通用,因此在 GameManager 中,在 GameManager 中管理每个玩家的卡牌也会更容易.您实际上可以在 GameManager 中维护一个私有的 Map 来存储每个玩家的卡片,并通过将这些地图包装在一个不可修改的地图中来使卡片对 Player 及其实现可见,创建方式如 Collections.unmodifiableMap().

  • 如果大部分逻辑是高度玩家特定的并且与其他玩家的交互不多,则最好将逻辑放在 Player 或 Player 中实施。在这种情况下,您可以直接在抽象 Player.

  • 中维护可修改的 Set 卡片

但请始终牢记,如果不是在 Player 中,那么在 GameManager 中,您总是可以通过编码错误来搞砸事情。所以差异应该很小。