Memento Pattern Example

The following Java program illustrates the "undo" usage of the Memento Pattern.

import java.util.List;
import java.util.ArrayList;
class Originator {
    private String state;
    // The class could also contain additional data that is not part of the
    // state saved in the memento.
    public void set(String state) {
        System.out.println("Originator: Setting state to " + state);
        this.state = state;
    public Memento saveToMemento() {
        System.out.println("Originator: Saving to Memento.");
        return new Memento(state);
    public void restoreFromMemento(Memento memento) {
        state = memento.getSavedState();
        System.out.println("Originator: State after restoring from Memento: " + state);
    public static class Memento {
        private final String state;
        private Memento(String stateToSave) {
            state = stateToSave;
        private String getSavedState() {
            return state;
class Caretaker {
    public static void main(String[] args) {
        List<Originator.Memento> savedStates = new ArrayList<Originator.Memento>();
        Originator originator = new Originator();
        // We can request multiple mementos, and choose which one to roll back to.

The output is:

Originator: Setting state to State1
Originator: Setting state to State2
Originator: Saving to Memento.
Originator: Setting state to State3
Originator: Saving to Memento.
Originator: Setting state to State4
Originator: State after restoring from Memento: State3