Memento模式与序列化的区别

我正在对Memento模式进行一些研究,我通常对行为模式不熟悉,而且我的研究让我感到非常困惑。 我一直困惑的主要问题之一是Memento Pattern和Serialization之间的差异。

从我可以收集的内容中,两者都可以用来存储物品,并在以后将它们带回来,但我无法找到关于它们之间的主要差异的明确答案,也许我在研究中遗漏了一些东西但我想知道是否有人可以透露两者之间的差异。

谢谢

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

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

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

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

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

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

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

因此,序列化可以是一种实现机制,您可以通过它实现Memento模式。

但是,您可以轻松实现memento模式而无需使用序列化。

Memento是一种软件设计模式,可以将对象恢复到以前的状态(通过回滚撤消)。

纪念品的结构:

在此处输入图像描述

纪念品模式由三个对象实现: 创始人看护人纪念品

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

看护人会对创始人做点什么,但希望能够撤消变更。 看护人首先要求发起人提供纪念品。 然后它执行它将要执行的任何操作(或操作序列)。 要回滚到操作之前的状态,它会将memento对象返回给发起者

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

使用Serializable而不是写入和读取对象到文件

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

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