gpt4 book ai didi

java - Memento 和 Command 设计模式有什么区别?

转载 作者:行者123 更新时间:2023-11-30 02:14:14 24 4
gpt4 key购买 nike

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

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

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

我认为它们将在这样的界面中实现:

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

我是在实现 Memento 或 Command 设计模式,还是两者都不实现?我无法理解在该游戏的撤消/重做上下文中这两种设计模式是什么样的。我也是 Java OOP 和一般设计模式的初学者。

最佳答案

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

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

Memento 是一种存储状态以使其可恢复的方式。假设您有一个类似 GameState 的类,它表示游戏的当前状态。如果您的 GameState 具有 GameStateBackup createBackup()restoreFromBackup(GameStateBackup) 等方法,那么您就可以实现 Memento。

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

一种方法是记录所有 Action 。然后您可以“撤消”移动。或者简单地“重播”前 n-x 步棋。这就是命令方法。

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

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

关于java - Memento 和 Command 设计模式有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49098745/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com