WalzoneInterview Prep
📞 Interviewing soon? Practice with a realistic AI mock phone interview — it calls you, then scores you. First 15 min FREE →

Design Patterns · Intermediate · question 26 of 100

Explain how the Memento pattern can be used in conjunction with the State pattern to store and restore object states.?

📕 Buy this interview preparation book: 100 Design Patterns questions & answers — PDF + EPUB for $5

The Memento pattern and State pattern are both behavioral design patterns, and they can be used together to implement a solution that manages the states of an object and provides the ability to undo/revert to a previous state.

The State pattern allows an object to alter its behavior when its internal state changes. This pattern encapsulates the object’s behavior into separate state objects, which can be changed at runtime based on the state transition. The State pattern ensures that the object’s change in behavior is inverted on state change.

On the other hand, the Memento pattern provides the ability to capture and restore an object’s internal state at a particular point in time without breaking encapsulation.

To use these patterns together, we can introduce a Memento object that stores the state of the Subject object. This Memento object will be managed by the Caretaker object, which is responsible for storing and restoring Memento objects. So, when the Subject object changes its state, the State pattern will manage the transition between different states while the Memento pattern will capture the current state of the Subject object and store it in a Memento object.

Here is an example of how this can be implemented:

// Memento class
public class Memento {
  private State state;

  public Memento(State state) {
    this.state = state.clone();
  }
  
  public State getState() {
    return state;
  }
}

// Caretaker class
public class Caretaker {
  private Stack<Memento> mementos = new Stack<>();
  
  public void save(Memento memento) {
    mementos.push(memento);
  }
  
  public Memento restore() {
    if(mementos.empty()) {
      return null;
    }
    return mementos.pop();
  }
}

// Subject class
public class Subject {
  private State state;

  public void setState(State state) {
    this.state = state;
  }
  
  public Memento captureState() {
    return new Memento(state);
  }
  
  public void restoreState(Memento memento) {
    this.state = memento.getState();
  }
}

// State interface
public interface State {
  void handle();
  State clone();
}

// Concrete State classes
public class StateA implements State {
  private Subject subject;
  
  public StateA(Subject subject) {
    this.subject = subject;
  }
  
  @Override
  public void handle() {
    // handle StateA's operation
    subject.setState(new StateB(subject));
  }
  
  @Override
  public State clone() {
    return new StateA(subject);
  }
}

public class StateB implements State {
  private Subject subject;

  public StateB(Subject subject) {
    this.subject = subject;
  }
  
  @Override
  public void handle() {
    // handle StateB's operation
    subject.setState(new StateC(subject));
  }
  
  @Override
  public State clone() {
    return new StateB(subject);
  }
}

public class StateC implements State {
  private Subject subject;

  public StateC(Subject subject) {
    this.subject = subject;
  }
  
  @Override
  public void handle() {
    // handle StateC's operation
  }
  
  @Override
  public State clone() {
    return new StateC(subject);
  }
}

In this example, the ‘Subject‘ class has a ‘captureState()‘ method to capture its internal state and return a ‘Memento‘ object. Similarly, it has a ‘restoreState(Memento memento)‘ method to restore the internal state from a given ‘Memento‘ object.

The ‘Caretaker‘ class manages the stack of ‘Memento‘ objects and provides the ability to store and restore the ‘Subject‘s internal state.

The ‘State‘ interface defines the contract for concrete state classes. Each concrete state class (e.g. ‘StateA‘, ‘StateB‘, and ‘StateC‘) implements the ‘State‘ interface and provides its own implementation for ‘handle()‘ method to perform its specific operations. Additionally, each concrete state class must also implement the clone method to make sure that the behavior change in the class is properly inverted.

In conclusion, the combination of the Memento and State patterns provides a powerful mechanism to store and restore an object’s internal state while providing the ability to change the object’s behavior based on its current state.

Reading is step one. Saying it out loud is the interview. Our AI interviewer calls your phone and runs a realistic Design Patterns interview — then scores it.
📞 Practice Design Patterns — free 15 min
📕 Buy this interview preparation book: 100 Design Patterns questions & answers — PDF + EPUB for $5

All 100 Design Patterns questions · All topics