4

我已经成功地在 Java 上编写了一个纸牌游戏,现在我被要求在我的设计之上实现撤消/重做。

我的计划是存储用户执行的移动列表或堆栈,如果用户想要撤消,我会 1. 检查用户是否可以撤消(即列表或堆栈中有移动),然后 2. 反向我存储的最后两个动作(即我将卡片从其中移动的“从”移动和将卡片移动到的“到”移动)。

对于重做,我只会重做动作,具体取决于用户执行撤消操作的距离(例如,如果他们按下撤消两次,我至少会(列表大小 - 4)在我的列表或堆栈中)。

我认为它们将在这样的接口中实现:

public interface UndoRedo {
    void undo();
    void redo();
 }

我是在实现 Memento 还是 Command 设计模式,还是两者都没有?在这个游戏的撤消/重做的上下文中,我无法掌握这两种设计模式的样子。我也是 Java OOP 和一般设计模式的初学者。

4

3 回答 3

8

根据您的描述,您似乎实现了命令模式。

命令捕获执行某些操作(不一定要撤消此操作)所需的所有信息。你的动作基本上是命令。

Memento 是一种存储状态以使其可恢复的方式。假设你有一个GameState代表游戏当前状态的类。如果您GameState有类似GameStateBackup createBackup()and的方法,您将实施 Memento restoreFromBackup(GameStateBackup)

考虑一个国际象棋游戏,您希望能够恢复最后 x 步。

一种方法是记录所有动作。然后,您可以“撤消”移动。或者简单地“重播”第一个 nx 动作。那将是命令方法。

另一种方法是保存游戏的最后 x 个状态(并能够恢复它们)。这就是纪念品方法。

您实际上可以同时使用这两种模式。例如,当“撤消”的实现不可行时,您可以记录每次移动之前/之后的游戏状态以使移动可撤消。

于 2018-03-04T19:09:42.710 回答
3

如果您通过在状态上执行命令来撤消/重做,那就是命令模式。如果您通过从状态缓存中替换状态来撤消/重做,那就是纪念品。

UNDO/REDO 的 Command 模式和 Memento 模式之间的区别在于,在 Command 模式中,您以更改状态属性的相同顺序重新执行命令,而在 Memento 中,您通过从缓存/存储。 Python 中的设计模式:ASIN B08XLJ8Z2J

于 2019-10-18T21:27:03.527 回答
0

两者都不。您将先前的输入存储为状态并允许对数据执行操作。

Memento 为确定性函数的每个唯一输入存储计算值,如果再次看到相同的输入,则返回存储的值。

命令将执行代码及其输入捆绑为单个对象,稍后可以通过将输入传递给可执行文件来执行该对象。

它接近 Command,但看起来不像是 Command,因为它不是独立的异步操作。

于 2018-03-04T19:50:26.203 回答