【问题标题】:What is the difference between Memento and Command design pattern?备忘录和命令设计模式有什么区别?
【发布时间】:2018-08-12 10:00:07
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

标签: java oop design-patterns command memento


【解决方案1】:

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

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

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

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

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

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

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

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

    • 对 Memento 的描述意味着它只不过是缓存。那是过于简单化了。另外我认为Command的描述应该以“将object传递给executor”结尾。
    【解决方案3】:

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

    UNDO/REDO 的 Command 模式和 Memento 模式的区别在于,在 Command 模式中,您按照更改状态属性的相同顺序重新执行命令,而使用 Memento,您可以完全替换状态通过从缓存/存储中检索。 Design Patterns In Python: ASIN B08XLJ8Z2J

    【讨论】:

      猜你喜欢
      • 2013-08-27
      • 1970-01-01
      • 2011-04-11
      • 1970-01-01
      • 2015-12-28
      • 2011-05-13
      • 2016-09-29
      • 2011-05-24
      • 2010-10-08
      相关资源
      最近更新 更多