3

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

情况如下:

Oringator 持有一个对象来执行一些方法。

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

示例代码:

http://pastebin.com/4rV2aw3B

问题是,java 确实按值传递,而不是按引用传递。但是对象传递有点棘手。如果我将一个对象传递给该方法,尽管该方法拥有一个新的对象内存地址,但该内存地址仍指向传入的同一对象。请参见此示例: http ://www.javaworld.com/javaqa /2000-05/03-qa-0526-pass.html

如果我创建备忘录并将对象传递给新的备忘录对象,备忘录对象仍然保存原始复杂对象(需要备份)。

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

谢谢你。

4

2 回答 2

6

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

我认为这样做的目的是让 Memento 保存一份differentObj状态副本……

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

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

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

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

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


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

于 2013-11-18T17:21:40.763 回答
0

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

于 2013-11-18T17:24:35.623 回答