仅在撤消时允许反向操作

时间:2017-05-04 19:07:19

标签: java design-patterns methods undo

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

现在让我们假设我们有一个名为SourceCardDeck的类,它代表卡片的来源。此类可以弹出一张卡,但它没有能力推回卡(这是所需,因为用户能够存储卡在源甲板上。)

但现在我想实现撤消操作!

如果没有任何方法推回卡,我怎么能这样做?我听说过Command模式,但它只适用于反向方法。关于卡及其出现的能力呢?卡有调低的方法吗?用户通常无法再次关闭卡。但是在撤消中需要它。

如何使这种方式干净利落?

1 个答案:

答案 0 :(得分:1)

一个相当广泛的问题,因此是一个广泛的答案,意味着让你前进:基本上你在问:我怎样才能以与该对象的公共API冲突的方式“恢复”对象的状态?

这里有两个选项:

  • 您重新考虑自己的API。例如,您可以让特殊卡堆栈实现某个接口。该接口仅公开从堆栈中获取卡的方法(从而防止意外推回)。但是实现这个接口的类也可能实现另一个接口;这允许推回。因此,“大多数”代码使用了take-only接口“view”;只有那个需要推回的部分才能在另一个界面上工作。
  • 当您无法更改单个对象的状态时 - 您可以简单地“保留”所有对象的状态。对于每个州的变化。并且“撤消”表示:将所有对象取消持久保存到先前内容。换句话说:在状态发生变化时,您可以序列化游戏中的所有对象;和“撤消”表示:反序列化所有对象。

这两种方法都有其优点和缺点;因为这是你的项目,所以我会讨论这些方面并将决定作为练习给读者。

最后:不应该知道被拒绝或注意。 只是一张卡片。想想你正在尝试建模的真实世界域。纸牌游戏中的牌不会改变一点。它总是只是一块纸板上印有东西。它没有状态。唯一具有状态的东西:包含卡片对象的各种堆。