DCSIMG
Memento Pattern - Gil Fink's Blog

Gil Fink's Blog

Fink about IT

News

Microsoft MVP

My Facebook Profile My Twitter Profile My Linkedin Profile

Locations of visitors to this page

Creative Commons License

Disclaimer
The opinions expressed herein are my own personal opinions and do not represent my employer's view in anyway.
© Copyright 2013 Gil Fink

Hebrew Articles

Index Pages

My OSS Projects

English Articles

Memento Pattern

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.

Comments

DotNetKicks.com said:

You've been kicked (a good thing) - Trackback from DotNetKicks.com

# August 1, 2008 7:11 AM