Pages

Thursday, 12 May 2016

Memento Design Pattern in Java

Without violating encapsulation, the intent of this pattern is to capture the internal state of an object so that the object can be restored to this state later.

Memento pattern is used to implement this in such a way that the saved state data of the object is not accessible outside of the object; this protects the integrity of saved state data.



Participants

The classes and objects participating in this pattern are:
·         Memento
·         Originator
·         Caretaker

Example of memento pattern

Memento.java
public class Memento {
      private String state;

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

      public String getState(){
            return state;
      }    
}

FileWriterUtil.java
public class FileWriterUtil {
      private String state;

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

      public String getState(){
            return state;
      }

      public Memento saveStateToMemento(){
            return new Memento(state);
      }

      public void getStateFromMemento(Memento Memento){
            state = Memento.getState();
      }
}

FileCareTaker.java
import java.util.ArrayList;
import java.util.List;

public class FileCareTaker {
     
      private List<Memento> mementoList = new ArrayList<Memento>();

      public void add(Memento state){
            mementoList.add(state);
      }

      public Memento get(int index){
            return mementoList.get(index);
      }
}

FileHandlerClient.java
public class FileHandlerClient {
      public static void main(String[] args) {

            FileWriterUtil originator = new FileWriterUtil();
           
            FileCareTaker careTaker = new FileCareTaker();

            originator.setState("State#1");
           
            originator.setState("State#2");
            /*save the current state. i.e#State#2*/
            careTaker.add(originator.saveStateToMemento());

            originator.setState("State#3");
            /*save the current state. i.e#State#3*/
            careTaker.add(originator.saveStateToMemento());

            originator.setState("State#4");
            System.out.println("Current State: " + originator.getState());         

            originator.getStateFromMemento(careTaker.get(0));
            System.out.println("First saved State: " + originator.getState());
           
            originator.getStateFromMemento(careTaker.get(1));
            System.out.println("Second saved State: " + originator.getState());
      }
}

Output:
Current State: State#4
First saved State: State#2
Second saved State: State#3

Database Transactions:
Mechanism of rolling back the transaction can be achieved by memento design pattern.

Example in Java's core libraries:
java.util.Date (the setter methods do that, Date is internally represented by a long value)

All implementations of java.io.Serializable

All implementations of javax.faces.component.StateHolder



No comments:

Post a Comment