我正在对Memento模式进行一些研究,我通常对行为模式不熟悉,而且我的研究让我感到非常困惑。我一直困惑的主要问题之一是Memento Pattern和Serialization之间的差异。
从我可以收集的内容中,两者都可以用来存储物品,并在以后将它们带回来,但我无法找到关于它们之间的主要差异的明确答案,也许我已经遗漏了一些东西在我的研究中,但我想知道是否有人可以阐明两者之间的差异。
由于
答案 0 :(得分:14)
通常,Memento模式用于实现回滚/保存点支持。例如,我可能想要在某个时间点标记对象的状态,做一些工作,然后决定将该对象恢复到标记的点。
Memento模式的实现可以使用序列化,这将涉及将对象的内容保存到byte []并保留在内存中或写入磁盘。当还原对象的内容时,将从序列化副本重建。
相反,我可以通过克隆内存中的对象并保持对副本的引用然后在对象需要还原时将状态复制回来来实现Memento模式。此方法不使用序列化。
答案 1 :(得分:8)
Memento模式是一种OO设计模式,用于将对象的先前状态保存在内存中。例如,实现“撤消”操作很有用。
序列化是将对象图转换为字节数组的过程,例如,将其保存在磁盘上,或通过网络将其发送到另一个JVM。他们并没有太多共同之处。
答案 2 :(得分:1)
设计模式顾名思义解决设计问题。
序列化是一种“冻干”物体的方法。
因此,序列化可以是一种实现机制,您可以通过它实现Memento模式。
但是,您可以在不使用序列化的情况下轻松实现memento模式。
答案 3 :(得分:1)
Memento是一种软件设计模式,可以将对象恢复到以前的状态(通过回滚撤消)。
memento的结构:
memento模式由三个对象实现: originator ,看守和 memento 。
发起人是一个具有内部状态的对象。
看守将对发起人做一些事情,但希望能够撤消更改。看护人首先要求发起人提供纪念品。然后它执行它将要执行的任何操作(或操作序列)。要回滚到操作之前的状态,它会将 memento 对象返回给创建者。
序列化用于保持对象状态。这不是一种设计模式。有关序列化的详细信息,请参阅此SE问题。
Use of Serializable other than Writing& Reading object to/from File
Memento 模式可能会也可能不会使用序列化。如果memento对象没有离开JVM或没有通过远程调用传递给其他服务,memento可以将对象状态存储在内存中,而不包含 Serialization 。稍后可以使用存储的对象来更改状态。
有关详细信息,请参阅sourcemaking文章。