Wzorce projektowe - wzór Memento

Wzorzec Memento służy do przywracania stanu obiektu do poprzedniego stanu. Wzór Memento należy do kategorii wzorców behawioralnych.

Realizacja

Wzorzec Memento wykorzystuje trzy klasy aktorów. Memento zawiera stan obiektu do przywrócenia. Twórca tworzy i przechowuje stany w obiektach Memento, a obiekt Caretaker jest odpowiedzialny za przywrócenie stanu obiektu z Memento. Stworzyliśmy klasy Memento , Originator i CareTaker .

MementoPatternDemo , nasza klasa demonstracyjna, użyje obiektów CareTaker i Originator do pokazania przywracania stanów obiektów.

Krok 1

Utwórz klasę Memento.

Memento.java

public class Memento {
   private String state;

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

   public String getState(){
      return state;
   }	
}

Krok 2

Utwórz klasę inicjatora

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();
   }
}

Krok 3

Utwórz klasę 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);
   }
}

Krok 4

Użyj obiektów CareTaker i 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());
   }
}

Krok 5

Sprawdź dane wyjściowe.

Current State: State #4
First saved State: State #2
Second saved State: State #3