我正在研究备忘录模式,但是我对行为模式不太了解,在我的研究中,我感到非常困惑。其中一个主要的问题是备忘录模式和序列化之间的区别。
据我所知,两者都可以用于存储对象,并在以后的某个时间将它们恢复,但我没有找到明确的答案,说明它们之间的主要区别是什么。也许我在研究中遗漏了一些东西,但我想知道是否有人能够阐明两者之间的区别。
谢谢
我正在研究备忘录模式,但是我对行为模式不太了解,在我的研究中,我感到非常困惑。其中一个主要的问题是备忘录模式和序列化之间的区别。
据我所知,两者都可以用于存储对象,并在以后的某个时间将它们恢复,但我没有找到明确的答案,说明它们之间的主要区别是什么。也许我在研究中遗漏了一些东西,但我想知道是否有人能够阐明两者之间的区别。
谢谢
通常,备忘录模式用于实现回滚/保存点支持。例如,我可能想在某个时间点标记对象的状态,做一些工作,然后决定将该对象恢复到标记的状态。
备忘录模式的实现可以使用序列化,这将涉及将对象的内容保存到byte[]中并保留在内存中或写入磁盘。在恢复时,对象的内容将从序列化副本重建。
相反,我可以通过在内存中克隆对象并保留对副本的引用,然后如果需要还原对象,则将状态复制回来来实现备忘录模式。此方法不使用序列化。
Memento模式是一种面向对象的设计模式,用于在内存中保存对象的先前状态。例如,实现“撤销”操作非常有用。
序列化是将对象图转换为字节数组的过程,以便将其保存在磁盘上或通过网络发送到另一个JVM等。它们没有太多共同点。
备忘录是一种软件设计模式,提供了将对象恢复到其先前状态的能力(通过回滚进行撤销)。
备忘录的结构如下:
备忘录模式由三个对象实现:发起人(originator),看守者(caretaker)和备忘录(memento)。
发起人是具有内部状态的某个对象。
看守者要对发起人进行某些操作,但希望能够撤消更改。看守者首先向发起人请求一个备忘录对象。然后进行任何操作(或操作序列)。为了回滚到操作之前的状态,它会将备忘录对象返回给发起人。
序列化用于持久化对象状态。这不是一个设计模式。有关序列化的更多详细信息,请参阅此SE问题。
除了将对象写入/从文件中读取之外,可使用Serializable的其他用途
备忘录模式可能会或可能不会使用序列化。如果备忘录对象没有离开JVM或未通过远程调用传递给其他服务,则备忘录可以在内存中存储对象状态而无需序列化。存储的对象可稍后用于更改状态。
有关详细信息,请参阅sourcemaking文章。
设计模式的名称暗示着它解决了设计问题。
序列化是一种“冷冻干燥”对象的方法。
因此,序列化可以作为实现备忘录模式的机制。
但是,您也可以不使用序列化轻松地实现备忘录模式。