Memento

Definition


Without violating encapsulation, capture and externalize an object's internal state so that the object can be restored to this state later.

UML class diagram


Participants


  • Memento
    • stores internal state of the Originator object. The memento may store as much or as little of the originator's internal state as necessary at its originator's discretion.
  • Originator
    • creates a memento containing a snapshot of its current internal state.
    • uses the memento to restore its internal state
  • Caretaker
    • is responsible for the memento's safekeeping
    • never operates on or examines the contents of a memento.

Sample code in Java

package com.hong.memento;

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

    public String getState() {
        return state;
    }
    public void setState(String state) {
        this.state = state;
    } 
}

class CareTaker {
    private Memento memento;
    public Memento getMemento() {
        return memento;
    }

    public void setMemento(Memento memento) {
        this.memento = memento;
    }
}

class Originator {
    
    private String state;
    public Memento createMemento(){
        return new Memento(state);
    }
    
    public String getState() {
        return state;
    }
    public void setState(String state) {
        this.state = state;
    }

    public void setMemento(Memento memento){
        this.state = memento.getState();
    }
}

public class Memento_structure {
    
    public static void main(String[] args) {
        
        Originator originator = new Originator();
        originator.setState("state_one");
        
        CareTaker careTaker = new CareTaker(); 
        careTaker.setMemento(originator.createMemento());
        System.out.println(originator.getState());
        
        //Change originator's state.
        originator.setState("state_two");
        System.out.println(originator.getState());
        
        //Reverse back the originator state. 
        originator.setMemento(careTaker.getMemento());
        System.out.println(originator.getState());
    
    }

}