16

我正在对纪念品模式进行一些研究,而且我通常对行为模式不熟悉,而且我的研究让我很困惑。我一直感到困惑的主要事情之一是备忘录模式和序列化之间的区别。

据我所知,两者都可用于存储对象并在以后将它们带回,但我无法找到关于它们之间主要区别的明确答案,也许我在研究中遗漏了一些东西但我想知道是否有人可以阐明两者之间的区别。

谢谢

4

4 回答 4

17

通常,Memento 模式用于实现回滚/保存点支持。例如,我可能想在某个时间点标记一个对象的状态,做一些工作,然后决定将该对象恢复到被标记的点。

Memento 模式的实现可以使用序列化,这将涉及将对象的内容保存到 byte[] 并保存在内存中或写入磁盘。当恢复对象的内容时,将从序列化的副本中重建。

相反,我可以通过在内存中克隆对象并保留对副本的引用,然后在对象需要恢复时将状态复制回来来实现 Memento 模式。此方法不使用序列化。

于 2012-12-28T22:54:23.237 回答
8

Memento 模式是一种 OO 设计模式,用于将对象的先前状态保存在内存中。例如,实现“撤消”操作很有用。

例如,序列化是将对象图转换为字节数组的过程,以便将其保存在磁盘上,或通过网络将其发送到另一个 JVM。他们没有太多共同点。

于 2012-12-28T22:55:31.360 回答
2

Memento 是一种软件设计模式,它提供了将对象恢复到其先前状态(通过回滚撤消)的能力。

纪念品结构 :

在此处输入图像描述

memento 模式由三个对象实现:originatorcaretakermemento

发起者是一些具有内部状态的对象。

看守者将对发起者做一些事情,但希望能够撤消更改。看守人首先向发起人索要纪念品。然后它会执行它要执行的任何操作(或操作序列)。为了回滚到操作之前的状态,它将memento对象返回给originator

序列化用于持久化对象状态。这不是设计模式。有关序列化的更多详细信息,请参阅此 SE 问题。

使用可序列化而不是向/从文件写入和读取对象

Memento模式可能使用也可能不使用Serialization。如果 memento 对象没有离开 JVM 或没有通过远程调用传递给其他服务,则 memento 可以将对象状态存储在内存中而无需序列化。存储的对象可以稍后用于更改状态。

有关更多详细信息,请参阅来源制作文章。

于 2016-07-15T05:44:28.257 回答
1

顾名思义,设计模式解决了设计问题。

序列化是一种“冻干”对象的方法。

所以序列化可能是一种实现机制,您可以通过它实现备忘录模式。

但是,您可以在不使用序列化的情况下轻松实现备忘录模式。

于 2012-12-28T22:56:50.580 回答