Memento
(Mémento)

But : Sans violer l'encapsulation, isoler et externaliser une partie de l'état interne d'un objet, afin de pouvoir restaurer ultérieurement l'objet dans cet état.
Permet de fournir un "undo" ou un "rollback".
Ce pattern définit 3 rôles : Le code client manipule l'originator (création, modification de son état).
Le code client ne s'adresse pas directement au mémento, mais passe par le caretaker. Memento - séquence

Structure GOF

Memento - structure

Exemple wikibook

(code dans exemples/patterns/memento/wikibooks)

Exemple simplifié où le mécanisme du Caretaker est géré dans main()

Exemple Vaisseau

(code dans exemples/patterns/memento/vaisseau)

Exemple plus complet, implémentant un mécanisme d'undo. Classes Memento Vaisseau
Exercice : Faire le diagramme de séquence correspondant à Main.main()

Implémentation du schéma GOF

public 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 setState(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();
        originator.setState("State1");
        originator.setState("State2");
        savedStates.add(originator.saveToMemento());
        originator.setState("State3");
        // We can request multiple mementos, and choose which one to roll back to.
        savedStates.add(originator.saveToMemento());
        originator.setState("State4");
 
        originator.restoreFromMemento(savedStates.get(1));  
    }
}

Remarques