备忘录模式与序列化的区别

17

我正在研究备忘录模式,但是我对行为模式不太了解,在我的研究中,我感到非常困惑。其中一个主要的问题是备忘录模式和序列化之间的区别。

据我所知,两者都可以用于存储对象,并在以后的某个时间将它们恢复,但我没有找到明确的答案,说明它们之间的主要区别是什么。也许我在研究中遗漏了一些东西,但我想知道是否有人能够阐明两者之间的区别。

谢谢

4个回答

20

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

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

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


2
啊,我明白了。据我所知,大多数备忘录模式的示例似乎都使用对象克隆方法。有没有特别的原因,使得大多数示例使用对象克隆而不是序列化呢? - Mr. Espresso
1
因为克隆对象比序列化过程更轻量级。假设你有一个包含1000个字符的String的对象Foo。克隆它只会创建一个新的对象,引用同一个String实例(只需几个字节),结果将是Foo类型。如果你序列化该对象,你将得到一个byte[]类型的结果,其中包含两个字符串的全部内容(5或6KB),当恢复对象时,你需要反序列化它,并创建两个字符串的新副本。虽然它可以用来实现深层克隆,但通常并不需要。 - JB Nizet
1
这里需要注意的是,克隆和序列化都可以是相当不透明的操作。当对象具有许多复杂引用到其他对象时,我从未很舒适地对其进行序列化。此外,有些对象根本无法序列化,例如线程、网络套接字。 - user1172468
感谢展示不同的保存和恢复方式——克隆和序列化。 - a3.14_Infinity
这是关于在数据库中存储备忘录/状态的讨论。 - Rhdr

8

Memento模式是一种面向对象的设计模式,用于在内存中保存对象的先前状态。例如,实现“撤销”操作非常有用。

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


2

备忘录是一种软件设计模式,提供了将对象恢复到其先前状态的能力(通过回滚进行撤销)。

备忘录的结构如下:

enter image description here

备忘录模式由三个对象实现:发起人(originator),看守者(caretaker)和备忘录(memento)。

发起人是具有内部状态的某个对象。

看守者要对发起人进行某些操作,但希望能够撤消更改。看守者首先向发起人请求一个备忘录对象。然后进行任何操作(或操作序列)。为了回滚到操作之前的状态,它会将备忘录对象返回给发起人。

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

除了将对象写入/从文件中读取之外,可使用Serializable的其他用途

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

有关详细信息,请参阅sourcemaking文章。


1

设计模式的名称暗示着它解决了设计问题。

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

因此,序列化可以作为实现备忘录模式的机制。

但是,您也可以不使用序列化轻松地实现备忘录模式。


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