Как использовать шаблон памяти с функцией отмены - PullRequest
0 голосов
/ 01 апреля 2019

У меня проблема с одновременным использованием памяти и шаблона команды. Я полностью понимаю, что шаблон памяти используется для сохранения состояния моего объекта при выполнении до выполнения изменения объекта, чтобы я мог вернуться к исходному объекту в неисполнение , но шаблон памятки всегда сохраняет одну и ту же ссылку на объект, когда я устанавливаю его состояние в памятке, нужно ли клонировать объект перед созданием памятки и его настройкой?

Вот что у меня есть:

public class Memento
{
    MyObject myObject;

    public MyObject getState()
    {
        return myObject;
    }

    public void setState(MyObject myObject)
    {
        this.myObject = myObject;
    }
}

Команда:

public class ZoomCommand extends Command
{
    Image image;
    Memento memento

    public InsertCharacterCommand(Image image)
    {
        //instantiate 
        this.image = image;
    }

    @Override public void execute()
    {
        //create Memento before executing
        memento = new Memento();
        // set the initial zoom level of the image before executing
        memento.setState(image);
        //set new state
        image.zoomIn(image.getZoom() + 1);
    }

    @Override public void unExecute()
    {
        // redo go back to initial state of image before zoom, but image has the same zoom level
        this.image = memento.getState();
    }
}

Изображение имеет такой же уровень масштабирования и в unExecute. Как это исправить?

1 Ответ

0 голосов
/ 01 апреля 2019

Да, вам нужно клонировать объект.

Как обычно, примеры, найденные в Интернете, довольно анемичны, но 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...