«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Понимание шаблона проектирования Memento в Java

Понимание шаблона проектирования Memento в Java

Опубликовано 7 августа 2024 г.
Просматривать:837

Understanding the Memento Design Pattern in Java

Проблема

Шаблон Memento учитывает необходимость захвата и восстановления внутреннего состояния объекта, не нарушая его инкапсуляцию. Это полезно в сценариях, где вы хотите реализовать функцию отмены/повтора, позволяющую объекту вернуться в предыдущее состояние.

Решение

Шаблон Memento включает в себя три основных компонента:

  1. Исходник: Объект, внутреннее состояние которого необходимо сохранить и восстановить.
  2. Memento: Объект, хранящий внутреннее состояние создателя. Сувенир неизменен.
  3. Смотритель: Отвечает за запрос отправителю сохранить или восстановить его состояние из памятного подарка.

Инициатор создает сувенир, содержащий снимок его текущего состояния. Этот сувенир затем может быть сохранен смотрителем и использован для восстановления состояния отправителя, когда это необходимо.

За и против

Плюсы

  • Сохраняет инкапсуляцию: Позволяет сохранять и восстанавливать внутреннее состояние объекта, не раскрывая детали его реализации.
  • Простая отмена/повтор: Облегчает реализацию функций отмены/повтора, делая систему более надежной и удобной для пользователя.
  • История состояний: Позволяет вести историю предыдущих состояний объекта, обеспечивая навигацию между различными состояниями.

Минусы

  • Потребление памяти: Хранение нескольких сувениров может занимать значительный объем памяти, особенно если состояние объекта велико.
  • Дополнительная сложность: Усложняет код из-за необходимости управлять созданием и восстановлением сувениров.
  • Обязанности смотрителя: Смотрителю необходимо эффективно управлять сувенирами, что может повысить ответственность и усложнить систему.

Пример реального применения

Практический пример использования шаблона Memento — текстовые редакторы, предлагающие функции отмены и повтора. Каждое изменение в документе можно сохранить на память, что позволит пользователю при необходимости вернуться к предыдущим состояниям документа.

Пример кода на Java

Шаблон сувенира в коде:

// Originator
public class Editor {
    private String content;

    public void setContent(String content) {
        this.content = content;
    }

    public String getContent() {
        return content;
    }

    public Memento save() {
        return new Memento(content);
    }

    public void restore(Memento memento) {
        content = memento.getContent();
    }

    // Memento
    public static class Memento {
        private final String content;

        public Memento(String content) {
            this.content = content;
        }

        private String getContent() {
            return content;
        }
    }
}

// Caretaker
public class History {
    private final Stack history = new Stack();

    public void save(Editor editor) {
        history.push(editor.save());
    }

    public void undo(Editor editor) {
        if (!history.isEmpty()) {
            editor.restore(history.pop());
        }
    }
}

// Client code
public class Client {
    public static void main(String[] args) {
        Editor editor = new Editor();
        History history = new History();

        editor.setContent("Version 1");
        history.save(editor);
        System.out.println(editor.getContent());

        editor.setContent("Version 2");
        history.save(editor);
        System.out.println(editor.getContent());

        editor.setContent("Version 3");
        System.out.println(editor.getContent());

        history.undo(editor);
        System.out.println(editor.getContent());

        history.undo(editor);
        System.out.println(editor.getContent());
    }
}
Заявление о выпуске Эта статья воспроизведена по адресу: https://dev.to/diegosilva13/understanding-the-memento-design-pattern-in-java-2c72?1 Если есть какие-либо нарушения, свяжитесь с [email protected], чтобы удалить их.
Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3