只允许在撤消中进行反向操作

Allow reverse operation in undo only

我正在尝试实现简单的纸牌游戏。

现在假设我们有一个名为 SourceCardDeck 的 class,它表示源牌组。 class 可以弹出一张卡片,但不能将卡片推回(需要,因为用户不应该 可以将卡存储在源卡组上)。

但是我现在想实现一个撤销操作!

没有推卡的方法怎么办?我听说过命令模式,但它只适用于可用的反向方法。 Card 及其出现的能力又如何呢?卡片应该有拒绝的方法吗?用户通常不能再次拒绝卡片。但在撤消时需要它。

如何使这种正确和干净的方式?

一个非常宽泛的问题,因此也是一个宽泛的答案,旨在让您继续:基本上您是在问:我如何 "restore" 对象的状态与 public API 那个对象?

这里有两个选项:

  • 您重新考虑您的 API。例如,您可以让那个特殊的卡片堆栈实现某个接口。该接口仅向 take 卡片公开方法(从而防止 accidental 推回)。但是 class 实现 该接口也可能实现另一个接口;这允许推回。因此,"most" 您的代码使用了只接受接口 "view";只有需要推回的部分才能在另一个界面上工作。
  • 当您无法更改单个对象的状态时 - 您可以简单地 "persist" 所有对象的 状态 。对于每个状态更改。 "undo" 表示:取消所有对象对先前内容的持久化。换句话说:您可以 序列化 游戏中状态改变时的所有对象; "undo" 表示:反序列化 all 个对象。

两种方法各有利弊;由于这是 你的 项目,我将讨论这些方面并作为 reader 的练习做出决定。

最后:一个应该不知道被拒签或者note了。 卡片只是一张卡片。只需考虑您尝试建模的真实世界领域。纸牌游戏中的纸牌不会改变一点。它始终只是一块硬纸板,上面印有一些东西。它没有状态。唯一有状态的东西:包含卡片对象的各种堆。