【问题标题】:Difference between Memento Pattern and Serialization备忘录模式和序列化之间的区别
【发布时间】:2012-12-14 03:32:25
【问题描述】:

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

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

谢谢

【问题讨论】:

    标签: java design-patterns serialization memento


    【解决方案1】:

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

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

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

    【讨论】:

    • 啊,明白了,从我收集到的大多数备忘录模式的例子似乎都使用了对象克隆方法。大多数示例使用对象克隆而不是序列化有什么特别的原因吗?
    • 因为克隆对象是比序列化更轻松的过程。假设您有一个对象 Foo,其中包含 1000 个字符的字符串。克隆它只会创建一个引用同一个 String 实例的新对象(只需要几个字节),结果将是 Foo 类型。如果你序列化对象,你将得到一个 byte[] 类型的结果,它将包含两个字符串的全部内容(5 或 6 KB),并且在恢复对象时,你必须反序列化它,并创建两个字符串的新副本。它可以用来实现深度克隆,它(通常不需要。
    • 这里请注意,克隆和序列化都可能是相当不透明的操作。当一个对象有很多对其他对象的复杂引用时,我对序列化它从来都不是很舒服。此外,还有一些对象根本不序列化,例如线程、网络套接字。
    • 感谢您展示不同的保存和恢复方式——克隆和序列化。
    • 这里是与Storing a memento/state in a database相关的讨论
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

      memento的结构:

      备忘录模式由三个对象实现:originatorcaretakermemento

      originator 是一些具有内部状态的对象。

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

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

      Use of Serializable other than Writing& Reading object to/from File

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

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

      【讨论】:

        【解决方案4】:

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

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

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

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

        【讨论】:

          猜你喜欢
          • 2018-08-12
          • 1970-01-01
          • 2012-07-09
          • 1970-01-01
          • 2013-12-20
          • 2019-11-17
          • 1970-01-01
          • 2018-06-28
          • 2020-07-05
          相关资源
          最近更新 更多