13 April 2014

Memento -- Design Patterns

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

Participants

    The classes and/or objects participating in this pattern are:
  • Memento  (Memento)
       Stores internal state of the Originator object. The memento may store as much or as little of the originators internal state as necessary at its originator's discretion.

       Protect against access by objects of other than the originator. 

       Mementos have effectively two interfaces.

       Caretaker sees a narrow interface to the Memento -- it can only pass the memento to the other objects. Originator, in contrast, sees a wide interface, one that lets it access all the data necessary to restore itself to its previous state.

      Ideally, only the originator that produces the memento would be permitted to access the memento's internal state.
  • Originator  (Sales Prospect)
     Creates a memento containing a snapshot of its current internal state.

     Uses the memento to restore its internal state
  •   Caretaker  (Caretaker)
    Is responsible for the memento's safekeeping

   Never operates on or examines the contents of a memento.

Example for Memento Design pattern:

using System; 
namespace  Memento.Structural
{
  /// <summary>
  /// MainApp startup class for Structural
  /// Memento Design Pattern.
  /// </summary>
  class MainApp
  {
    /// <summary>
    /// Entry point into console application.
    /// </summary>
    static void Main()
    {
      Originator o = new Originator();
      o.State = "On"; 
      // Store internal state
      Caretaker c = new Caretaker();
      c.Memento = o.CreateMemento(); 
      // Continue changing originator
      o.State = "Off";
       // Restore saved state
      o.SetMemento(c.Memento); 
      // Wait for user
      Console.ReadKey();
    }
  } 
  /// <summary>
  /// The 'Originator' class
  /// </summary>
  class Originator
  {
    private string _state; 
    // Property
    public string State
    {
      get { return _state; }
      set
      {
        _state = value;
        Console.WriteLine("State = " + _state);
      }
    } 
    // Creates memento
    public Memento CreateMemento()
    {
      return (new Memento(_state));
    } 
    // Restores original state
    public void SetMemento(Memento memento)
    {
      Console.WriteLine("Restoring state...");
      State = memento.State;
    }
  } 
  /// <summary>
  /// The 'Memento' class
  /// </summary>
  class Memento
  {
    private string _state; 
    // Constructor
    public Memento(string state)
    {
      this._state = state;
    } 
    // Gets or sets state
    public string State
    {
      get { return _state; }
    }
  } 
  /// <summary>
  /// The 'Caretaker' class
  /// </summary>
  class Caretaker
  {
    private Memento _memento; 
    // Gets or sets memento
    public Memento Memento
    {
      set { _memento = value; }
      get { return _memento; }
    }
  }
}

Output:
State = On
State = Off
Restoring state:
State = On


No comments:

Post a Comment