Memento Pattern

Definição

Sem violar o encapsulamento, o Memento Pattern permite gravar e externalizar o estado de um objecto, para que esse objecto seja restaurado para esse estado num momento mais tarde.

Utilização

Utilizado em aplicações onde é necessário recuperar o estado anterior de um objecto. Um exemplo comum onde design pattern pode ser implementado, é num editor de texto, IDE, aplicações chat, etc, onde é necessário desfazer alterações sobre acções dos seus utilizadores.

Classes

  • Originator: Possui um um objecto state interno, onde é possível salvar o seu estado.
  • Memento: Guarda o estado interno do Originator.
  • Store ou Caretaker: Gere o Originator, guardando ou desfazendo qualquer mudança. Responsável por gerir todos os mementos.

public class Originator {
    private String state;

    public static class Memento {
        private final String state;

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

        private String getSavedState() {
            return this.state;
        }

    }

    public void setState(String state) {
        this.state = state;
        System.out.println("Current State: " + state);
    }

    public Memento saveState() {
        return new Memento(this.state);
    }

    public void restoreState(Memento memento) {
        this.state = memento.getSavedState();
        System.out.println("Restoring to previous state...");
        System.out.println("Current State: " + state);
    }
}

 

public class Store {
    public static void main(String[] args) {
        Originator originator = new Originator();
        originator.setState("Initial State");
        Originator.Memento memento = originator.saveState();
        originator.setState("Intermediate State");
        originator.restoreState(memento);
    }
}

 

OUTPUT

Current State: Initial State
Current State: Intermediate State
Restoring to previous state...
Current State: Initial State

 

Uma abordagem muito utilizada é a criação de uma stack, utilizando a filosofia LIFO, onde são retirados todos os Mementos.

public class Store {
    public static void main(String[] args) {
        List<Originator.Memento> savedStates = new ArrayList<>();
        Originator originator = new Originator();

        originator.setState("Initial State");
        originator.setState("Intermediate State");
        savedStates.add(originator.saveState());
        originator.setState("Final State");
        savedStates.add(originator.saveState());
        originator.setState("Extension State");
        originator.restoreState(savedStates.get(1));
    }
}
OUTPUT: 

Current State: Initial State
Current State: Intermediate State
Current State: Final State
Current State: Extension State
Restoring to previous state...
Current State: Final State