Memento设计模式和State设计模式

6

Memento设计模式用于将对象恢复到先前的状态,就像撤消操作。但我们可以多次执行撤销和重做。我已经多次阅读文章,但仍然不清楚它们是否相似或互补,并且是否可以一起使用。

状态模式是否可以与Memento设计模式相关或一起使用?

3个回答

3
“状态模式”中的“状态”与备忘录模式所支持的状态不同。更好的命名方式应该是“模式模式”。有关详细信息,请参见此描述
现在,一个对象如果涉及到模式模式,可能会使用备忘录来描述其状态,但这是它们之间唯一的特定关系。

1
链接已失效。 - 0x6B6F77616C74
@tallseth 请更新描述链接。 - undefined

3
"Memento" 中的 "state" 是您保存以供以后检索的状态。它类似于书签。例如,您可以保存视频位置,然后使用 Memento 模式返回该位置。(状态保存在 Caretaker 参与者中。)
"State Design" 模式中的 "states" 就像状态机(或状态引擎)中的状态一样。它们就像一个更大的上下文,其中每个状态都有一组有限的移动。因此,如果您处于“On”状态,则您的选项是保持“On”状态或切换到“Off”状态。(状态模式没有条件语句!)
有关 PHP 示例,请参见:

http://www.php5dp.com/category/design-patterns/memento/

http://www.php5dp.com/category/design-patterns/state/


2
回答你的第一个问题,可以使用备忘录模式通过创建第二个备忘录实例来存储“重做”的“状态”。但是,根据对象状态的复杂程度,通常使用命令模式提供撤销/重做功能更“便宜”。命令可以用于仅存储要撤销/重做的更改,而备忘录可能需要存储整个状态。
tallseth的答案也正确,即状态模式中的“状态”与备忘录存储的“状态”不同。

实际上,你最好同时使用CommandMemento来实现撤销/重做功能:Command将使用Memento来维护撤销/重做操作所需的状态。请参见此处的“经验法则”。 - Scadge

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接