namespace PatternsConsole
{
class MementoPatter
{
// Originator
[Serializable]
class PersonInfo
{
public string Name { get; set; }
public float Salary { get; set; }
public Memento SetMemento()
{
var memento = new Memento();
return memento.Save( this );
}
public void GetMemento( Memento memento )
{
var info = memento.Restore() as PersonInfo;
if ( info != null )
{
Name = info.Name;
Salary = info.Salary;
}
}
}
// Memento
[Serializable]
class Memento
{
readonly MemoryStream stream = new MemoryStream();
readonly BinaryFormatter formatter = new BinaryFormatter();
public Memento Save( object obj )
{
formatter.Serialize( stream, obj );
return this;
}
public object Restore()
{
stream.Seek( 0, SeekOrigin.Begin );
var obj = formatter.Deserialize( stream );
stream.Close();
return obj;
}
}
// CareTaker
class CareTaker
{
public Memento Memento { get; set; }
}
private static void Main()
{
var personInfo = new PersonInfo
{
Name = "Person1", Salary = 5000
};
// Store internal state
var careTaker = new CareTaker
{
Memento = personInfo.SetMemento()
};
Console.WriteLine( "Saved State : \nName = {0}, Salary = {1}",
personInfo.Name, personInfo.Salary );
// Change originator
personInfo.Name = "Person2";
personInfo.Salary = 10000;
Console.WriteLine( "Changed Sate : \nName = {0}, Salary = {1}",
personInfo.Name, personInfo.Salary );
// Restore saved state
personInfo.GetMemento( careTaker.Memento );
Console.WriteLine( "Restored State : \nName = {0}, Salary = {1}",
personInfo.Name, personInfo.Salary );
// Output :
// Saved State :
// Name = Person1, Salary = 5000
// Changed Sate :
// Name = Person2, Salary = 10000
// Restored State :
// Name = Person1, Salary = 5000
Console.ReadLine();
}
}
}