【问题标题】:Allow reverse operation in undo only [closed]仅在撤消中允许反向操作[关闭]
【发布时间】:2017-10-03 02:37:58
【问题描述】:

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

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

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

如果没有任何方法将卡推回,我该如何做到这一点?我听说过命令模式,但它只适用于可用的反向方法。还有 Card 及其出现的能力呢?卡应该有拒绝的方法吗?用户通常不能再次拒绝卡。但在撤消时需要它。

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

【问题讨论】:

标签: java design-patterns methods undo


【解决方案1】:

一个非常广泛的问题,因此是一个广泛的答案,旨在让您继续前进:基本上您在问:我如何以与该对象的公共 API 冲突的方式“恢复”该对象的状态?

这里有两个选项:

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

这两种方法各有利弊;由于这是你的项目,我把这些方面的讨论和推动决策留给读者作为练习。

最后:卡片不应该知道被拒绝或注意。 卡片只是一张卡片。想想您要如何建模的现实世界领域。纸牌游戏中的牌不会有任何变化。它总是只是一块印有东西的纸板。它没有状态。唯一有状态的东西:包含卡片对象的各种堆。

【讨论】:

    猜你喜欢
    • 2011-06-18
    • 1970-01-01
    • 2014-06-21
    • 1970-01-01
    • 2012-06-11
    • 2011-12-01
    • 2017-04-17
    相关资源
    最近更新 更多