Инструменты пользователя

Инструменты сайта


pattern_memento

Назад

Паттерн хранитель используется для реализации возврата к одному из предыдущих состояний (например если пользователь выполнил команду «Отменить»)

Хранитель,- довольно простой паттерн, примеры его использования можно встретить гле угодно, где требуется сохранение состояния:

  • Сохранение тестового документа,
  • Сохранение игры,
  • Сохранение параметров аккаунта и т.д.

Преимущества Хранителя:

  • Хранение состояния отдельно от ключевого объекта улучшает связанность системы;
  • Простая реализация восстановления;
  • Инкапсуляция данных ключевого объекта.

Memento
class Memento
{
    private String state;
    public Memento(String stateToSave)
    {
        state = stateToSave;
    }
 
    public String getSavedState()
    {
        return state;
    }
}
Originator
class Originator
{
 
    private String state;
 
    public void set(String state)
    {
        System.out.println("Originator: Задаем состаяние " + state);
        this.state = state;
    }
 
    public Memento saveToMemento()
    {
        System.out.println("Originator: Сохранение состояния");
        return new Memento(state);
    }
 
    public void restoreFromMemento(Memento m)
    {
        state = m.getSavedState();
        System.out.println("Originator: Восстановлениe состояния " + state);
    }
}
Caretaker
class Caretaker
{
    private ArrayList<Memento> savedStates = new ArrayList<Memento>();
 
    public void addMemento(Memento m)
    {
        savedStates.add(m);
    }
 
    public Memento getMemento(int index)
    {
        return savedStates.get(index);
    }
}
Main
class Main
{
    public static void main(String[] args)
    {
        Caretaker caretaker = new Caretaker();
 
        Originator originator = new Originator();
        originator.set("1");
        originator.set("2");
        caretaker.addMemento(originator.saveToMemento());
        originator.set("3");
        caretaker.addMemento(originator.saveToMemento());
 
        originator.restoreFromMemento(caretaker.getMemento(0));
        originator.restoreFromMemento(caretaker.getMemento(1));
    }
}
Результат
Originator: Задаем состаяние 1
Originator: Задаем состаяние 2
Originator: Сохранение состояния
Originator: Задаем состаяние 3
Originator: Сохранение состояния
Originator: Восстановлениe состояния 2
Originator: Восстановлениe состояния 3