如何使用具有撤消功能的记忆模式

时间:2019-04-01 19:14:21

标签: java design-patterns

我同时使用备忘录和命令模式时遇到问题。我完全理解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;
    }
}

在“取消执行”中图像也具有相同的缩放级别,如何解决此问题?

1 个答案:

答案 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对象的深层副本