我同时使用备忘录和命令模式时遇到问题。我完全理解memento模式用于在执行对象更改之前将对象保存在执行状态,以便我可以在 unexecute 上返回到初始对象。 >,但是当在memento中设置对象的状态时,memento模式始终会保存该对象的相同引用,在创建memento并对其进行设置之前,我是否需要克隆对象?
这就是我所拥有的:
from_dict
命令:
public class Memento
{
MyObject myObject;
public MyObject getState()
{
return myObject;
}
public void setState(MyObject myObject)
{
this.myObject = myObject;
}
}
在“取消执行”中图像也具有相同的缩放级别,如何解决此问题?
答案 0 :(得分:0)
是的,您需要克隆对象。
和往常一样,在互联网上找到的例子有些贫乏,但是Refactoring Guru有一个可行的例子。他们用于加载和保存对象的代码如下:
public String backup() {
try {
ByteArrayOutputStream b= new ByteArrayOutputStream();
ObjectOutputStream o= new ObjectOutputStream(b);
o.writeObject(this.allShapes);
o.close();
return Base64.getEncoder().encodeToString(b.toByteArray());
} catch (IOException e) {
return "";
}
}
public void restore(String state) {
try {
byte[] data = Base64.getDecoder().decode(state);
ObjectInputStream o = new ObjectInputStream(new ByteArrayInputStream(data));
this.allShapes = (CompoundShape) o.readObject();
o.close();
} catch (ClassNotFoundException e) {
System.out.print("ClassNotFoundException occurred.");
} catch (IOException e) {
System.out.print("IOException occurred.");
}
}
请注意,它不处理引用。相反,它提供了一种保存和还原整个对象状态的方案。本质上,它是Java对象的深层副本。