纪念品模式 - 在纪念品中恢复复杂的物体(JAVA)

时间:2013-11-18 17:07:29

标签: java design-patterns pass-by-reference pass-by-value memento

感谢您阅读此问题。请帮我解决这个复杂的问题。

情况如下:

Oringator拥有一个执行某种方法的对象。

Memento模式需要在oringator中备份复杂的对象状态。如何?

示例代码:

http://pastebin.com/4rV2aw3B

问题是,java确实通过值传递,不通过引用传递。 但是对象传递有点棘手。 如果我将一个对象传递给方法,虽然该方法保存了一个新的对象的记忆地址,但是内存地址仍然指向传入的同一个对象。 看这个例子: http://www.javaworld.com/javaqa/2000-05/03-qa-0526-pass.html

如果我创建纪念品并将对象传递给新的纪念品对象,纪念品对象仍然保留了原始复杂对象(需要备份)。

那么,如何创建memento模式来备份命令模式中的复杂对象?

谢谢。

2 个答案:

答案 0 :(得分:6)

  

Memento模式需要在oringator中备份复杂的对象状态。如何?

我认为意图是纪念品应该保留differentObj州的副本......

没有神奇的解决方案。相反,它取决于differentObj是什么。

  • 如果它是不可变的,则根本不需要复制它。

  • 如果它有复制构造函数或克隆方法,您可以使用它,模数构造函数/方法具有所需的复制语义。

  • 如果它实现了SerializableExternalizable,那么您可以使用Java对象序列化,并使用序列化对象来表示已保存的状态,

  • 您可以编写自定义序列化程序,或使用Java到JSON或XML绑定。


请注意,(假设的)引用呼叫不一定能解决问题。您还需要某种形式的复制构造函数(或类似的)来允许复制...并且您将依赖于具有正确语义的构造函数。

答案 1 :(得分:0)

您是否尝试过克隆Memento对象?