Учебники

Шаблоны дизайна — Шаблон сувенира

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

Реализация

Шаблон Memento использует три актерских класса. Памятка содержит состояние объекта, который будет восстановлен. Originator создает и сохраняет состояния в объектах Memento, а объект смотрителя отвечает за восстановление состояния объекта из Memento. Мы создали классы Memento , Originator и CareTaker .

MementoPatternDemo , наш демонстрационный класс, будет использовать объекты CareTaker и Originator, чтобы показать восстановление состояний объекта.

UML-диаграмма Memento Pattern

Шаг 1

Создать класс Memento.

Memento.java

public class Memento {
   private String state;

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

   public String getState(){
      return state;
   }	
}

Шаг 2

Создать класс Originator

Originator.java

public class Originator {
   private String state;

   public void setState(String state){
      this.state = state;
   }

   public String getState(){
      return state;
   }

   public Memento saveStateToMemento(){
      return new Memento(state);
   }

   public void getStateFromMemento(Memento memento){
      state = memento.getState();
   }
}

Шаг 3

Создать класс CareTaker

CareTaker.java

import java.util.ArrayList;
import java.util.List;

public class CareTaker {
   private List<Memento> mementoList = new ArrayList<Memento>();

   public void add(Memento state){
      mementoList.add(state);
   }

   public Memento get(int index){
      return mementoList.get(index);
   }
}

Шаг 4

Используйте объекты CareTaker и Originator .

MementoPatternDemo.java

public class MementoPatternDemo {
   public static void main(String[] args) {
   
      Originator originator = new Originator();
      CareTaker careTaker = new CareTaker();
      
      originator.setState("State #1");
      originator.setState("State #2");
      careTaker.add(originator.saveStateToMemento());
      
      originator.setState("State #3");
      careTaker.add(originator.saveStateToMemento());
      
      originator.setState("State #4");
      System.out.println("Current State: " + originator.getState());		
      
      originator.getStateFromMemento(careTaker.get(0));
      System.out.println("First saved State: " + originator.getState());
      originator.getStateFromMemento(careTaker.get(1));
      System.out.println("Second saved State: " + originator.getState());
   }
}

Шаг 5

Проверьте вывод.