纪念模式背后的哲学


9

我一直在从Internet的各种来源阅读备忘录模式。来自不同来源的不同信息使我困惑,为什么实际上需要这种模式。

工厂实现中,该模式的主要目的是恢复系统状态。

Wiki的主要目的是能够恢复系统上的更改。这产生了不同的影响-表示系统可以执行memento实现而无需还原。而这种还原能力就是其中的一个功能。

OODesign

有时有必要在某个时刻捕获对象的内部状态,并具有稍后将对象恢复到该状态的能力。在发生错误或故障的情况下,这种情况很有用。

所以,我的问题是为什么我们到底要使用这个?是要保存以前的状态,还是要促进看守人和纪念品之间的封装?为什么这种封装如此重要?

编辑:对于那些访问,请检查实现!

编辑:我正在实施对我的问题的备忘录解决方案。我将就此发布另一个问题,并将该问题链接到这个问题。感谢所有人的宝贵建议!

编辑3这是我的示例实现的链接

Answers:


2

类似的模式(备注或备注)也存储状态,但通常用作程序速度优化。如果耗时的操作的公共输入和输出数量有限,则可以将最常见的输入和输出(或全部)存储在哈希表中。当再次使用相同的输入调用时,它首先检查哈希表,如果找到哈希表,则返回先前的输出,而无需重新计算它。

我想也可以将Memento模式用于性能-而不是对反向状态更改进行所有反向计算,只需从先前状态恢复即可。有些功能是单向的,因此除非您存储了先前的状态,否则不会撤消操作。

您可以使用Memento模式来记忆周期或对称函数(例如正弦波)。计算0-180度之间的所有值,然后向后遍历它们以获取180-360之间的负值。更好的是,从0-90计算值,然后向后遍历这些值以获得90-180,向后遍历180-270,从270-360向后。

Word中的Ctrl-Z或任何软件的撤消功能很可能是通过使用记忆模式来实现的,或者在某些情况下,可能是通过进行每次更改的功能的反向实现的。在第二种情况下,调用函数的历史将是mementos,因此我认为memento模式始终用于撤消。


用于避免反向计算和周期函数的记忆模式-感谢您提供此信息!没有什么比实际例子更能使概念渗入其中了!
TheSilverBullet

它也可以与牛顿法之类的用于平方根近似的方法一起使用,以决定何时完成。 mitpress.mit.edu/sicp/full-text/book / ... 由于底层浮点表示的准确性有限,因此所有数字最终都将具有重复的近似值。如果您知道以前的近似值是什么,则可以在第一次重复答案时停止近似值,从而获得最大的准确性(这会花费一些时间和内存)。
GlenPeterson 2012年

8

记忆模式本身仅用于捕获和保存状态。封装仅用于保护状态免受系统其余部分的侵害-一旦捕获到状态,就需要对其进行仔细控制。例如,一旦保存了先前状态就无法更改(这将更改历史记录),并且仅仅返回一个对象的先前状态而不影响其他对象可能就没有意义了(以防止系统进入完全无效的状态)。

我见过的Memento最常见的用法是支持撤消功能。它也与通过及时返回来存储重做功能有关。


我还在复制逻辑和序列化逻辑中使用了它(通过电线发送对象或将状态保存到文件)。
Scott Whitlock

@ScottWhitlock将状态保存到文件对Memento有意义。Memento对象将具有将其自身写入指定格式并通过读取该格式创建新格式的能力,而Caretaker将提供接口以将状态保存为外部格式或从外部格式加载状态-它只是扩展将状态保存到内存中。不过,我真的看不到它在复制逻辑中的使用。我不得不多考虑一下。
汤玛斯·欧文斯


@ThomasOwens,感谢您在此说明中的重要内容,即纪念品基本上是“保存”状态。实施者可以决定是否恢复!我发现我的所有参考书中都缺少这部分解释!!
TheSilverBullet

@ScottWhitlock,非常感谢您与memento实现的链接!我不仅能够理解它的基本用法,而且还能像您所做的那样直观地使用它!
TheSilverBullet 2012年

1

所有这些定义将您引向同一方向。他们都说要点是能够将某些内容恢复到以前的状态。那东西可以是整个系统,也可以是单个对象。

如果记录的状态随时间变化,则此模式很有用,但是您有业务需求,可以随时将其还原到任何以前的状态。或者,如果您需要能够查看以前任何时候的记录。这些类型的需求在许多类型的系统中非常普遍。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.