Design Patterns - Memento Pattern

Il motivo Memento viene utilizzato per ripristinare lo stato di un oggetto a uno stato precedente. Il pattern Memento rientra nella categoria dei pattern comportamentali.

Implementazione

Lo schema Memento utilizza tre classi di attori. Memento contiene lo stato di un oggetto da restaurare. Il creatore crea e memorizza gli stati negli oggetti Memento e l'oggetto Caretaker è responsabile del ripristino dello stato dell'oggetto da Memento. Abbiamo creato le classi Memento , Originator e CareTaker .

MementoPatternDemo , la nostra classe demo, utilizzerà gli oggetti CareTaker e Originator per mostrare il ripristino degli stati degli oggetti.

Passo 1

Crea una classe Memento.

Memento.java

public class Memento {
   private String state;

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

   public String getState(){
      return state;
   }	
}

Passo 2

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

Passaggio 3

Crea una classe 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);
   }
}

Passaggio 4

Usa gli oggetti CareTaker e 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());
   }
}

Passaggio 5

Verifica l'output.

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