【问题标题】:Implementing the command pattern实现命令模式
【发布时间】:2011-01-13 23:11:05
【问题描述】:

我正在设计应用程序,我想使用command pattern 进行撤消/重做。我对命令模式进行了一些研究,但唯一没有得到的是:一个命令是否应该具有撤消和重做方法,或者我应该创建两个单独的命令,一个用于撤消,一个用于重做,并从主命令本身?

【问题讨论】:

    标签: design-patterns undo-redo command-pattern


    【解决方案1】:

    命令对象本身应该实现撤消/重做功能。

    命令通常从命令管理器维护的堆栈中推送和弹出以实现多级撤消。当命令被执行时,它们被压入堆栈,当它们被撤消时,它们被从堆栈中弹出。

    备忘录模式将与命令模式结合使用,它不能替代命令模式的使用。它将用于维护撤消操作所需的状态。

    【讨论】:

    • 我要补充一点,更好的解决方案不仅仅是一个简单的堆栈。相反,您需要一个列表和对当前项目的引用。撤消将引用返回,而重做将其向前移动。使用堆栈不会让您重做。
    • 我使用了 2 个堆栈,撤消和重做堆栈。如果撤消一个动作,它会从撤消堆栈中弹出并压入重做堆栈。添加新动作就是将新动作压入撤消堆栈并清除重做堆栈。
    【解决方案2】:

    您可能还想为此考虑备忘录模式,我们使用它,它非常适合撤消。

    【讨论】:

    • 当我只希望它撤消时,备忘录模式是否会比命令模式更省时?
    • @slayerIQ 备忘录模式将与命令模式结合使用,它不能替代命令模式的使用。
    • 所以备忘录将保存撤消和重做堆栈,堆栈将包含命令,对吗?
    • @slayerIQ 备忘录将保存对象之前的状态,以便可以撤消。
    • 如果您的对象很大,备忘录模式会占用大量内存。使用命令模式基本上意味着只存储对象先前状态和当前状态之间的差异,其中备忘录存储整个状态。
    猜你喜欢
    • 1970-01-01
    • 2015-10-19
    • 1970-01-01
    • 1970-01-01
    • 2021-10-11
    • 2013-12-07
    • 2017-12-06
    • 1970-01-01
    • 2015-02-10
    相关资源
    最近更新 更多