Memento Pattern

August 1, 2008

no comments

Memento Pattern


This post is another post in the design patterns series. The post will describe and
show why and how to use the memento design pattern.
You can read my previous posts about design patterns here:
Structural patterns
Decorator pattern 
Proxy pattern
Facade pattern
Adapter pattern
Composite pattern
Bridge pattern
Flyweight pattern

Creational patterns
Singleton pattern
Abstract Factory pattern
Prototype pattern
Factory Method pattern
Builder pattern

Behavioral Patterns
Strategy pattern
Iterator pattern 
Template method pattern
Command pattern
Chain of responsibility pattern 
Mediator pattern

Memento Pattern 
The memento design pattern is a pattern that helps to save the object internal
state in an external place enabling us to restore the state later when needed.
The memento pattern doesn’t violate encapsulation of the internal state.
If you read my previous post about the command pattern you’ll probably remember
the undo example I showed. The example was simple and if you really want to save the
object’s state the memento pattern can help you do that. 
Even so, The pattern is rarely used but it’s very helpful in scientific computing or in
computer games (saving of check points in the game for example).
 
Use Cases for the Memento Pattern

You should use the pattern in the following cases:



  • You need to save object’s state and use the saved state later in order to
    restore the saved state.

  • You don’t want to expose the internal state of your object.

UML Diagram  
Memento Pattern UML   


Example in C#
The following code is an example of how to implement the pattern:



    #region Originator


    public class Originator<T>


    {


        #region Properties


        public T State { get; set; }


        #endregion


        #region Methods


        /// <summary>


        /// Creates a new memento to hold the current


        /// state


        /// </summary>


        /// <returns>The created memento</returns>


        public Memento<T> SaveMemento()


        {


            return (new Memento<T>(State));


        }


        /// <summary>


        /// Restores the state which is saved in the given memento


        /// </summary>


        /// <param name=”memento”>The given memento</param>


        public void RestoreMemento(Memento<T> memento)


        {           


            State = memento.State;


        }


        #endregion


    }


    #endregion


    #region Memento


    public class Memento<T>


    {


        #region Properties


        public T State { get; private set; }


        #endregion


        #region Ctor


        /// <summary>


        /// Construct a new memento object with the


        /// given state


        /// </summary>


        /// <param name=”state”>The given state</param>


        public Memento(T state)


        {


            State = state;


        }


        #endregion


    }


    #endregion


    #region Caretaker


    public class Caretaker<T>


    {


        #region Properties


        public Memento<T> Memento { get; set; }


        #endregion


    }


    #endregion


The given example shows the three parts of the pattern: the Originator, the Memento
and the Caretaker. The Caretaker is the repository for the Memento. You can also see 
that once the Memento object is created you can’t change the saved state and in order
to save a new Memento you need to create it again.
Lets look at an example of how to use the pattern in code:



   Originator<string> org = new Originator<string>();


   org.State = “Old State”;


   // Store internal state in the caretaker object


   Caretaker<string> caretaker = new Caretaker<string>();


   caretaker.Memento = org.SaveMemento();


   Console.WriteLine(“This is the old state: {0}”, org.State);


   org.State = “New state”;


   Console.WriteLine(“This is the new state: {0}”, org.State);


   // Restore saved state from the caretaker


   org.RestoreMemento(caretaker.Memento);


   Console.WriteLine(“Old state was restored: {0}”, org.State);


   // Wait for user


   Console.Read();


As you can see the saved state is inserted to the Caretaker object and than
you can change the state of the Originator to whatever you need. In order to
restore the Originator state you use the restore method and pass it the Caretaker’s
saved Memento.


Summary
To sum up the post, the memento pattern is is used for saving encapsulated object state
in an external object. The state can then be restored by demand.
As I wrote the places that you’ll want to use the pattern are in scientific
computing or in computer games but it can be helpful also in other places.
The next post in the series will explain the state pattern.


Add comment
facebook linkedin twitter email

Leave a Reply

Your email address will not be published.

*

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>