Add iterative memento example
This commit is contained in:
50
src/MememntoPattern/IterativeEmployee/Caretaker.cs
Normal file
50
src/MememntoPattern/IterativeEmployee/Caretaker.cs
Normal file
@@ -0,0 +1,50 @@
|
|||||||
|
using System.Collections.Generic;
|
||||||
|
|
||||||
|
namespace MememntoPattern.IterativeEmployee
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Caretaker
|
||||||
|
/// </summary>
|
||||||
|
public class Caretaker
|
||||||
|
{
|
||||||
|
EmployeeMemento initialMememento;
|
||||||
|
List<EmployeeMementoDiff> diffs;
|
||||||
|
|
||||||
|
public Caretaker()
|
||||||
|
{
|
||||||
|
diffs = new List<EmployeeMementoDiff>();
|
||||||
|
initialMememento = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Save(Employee emp)
|
||||||
|
{
|
||||||
|
EmployeeMemento memento = emp.Save();
|
||||||
|
|
||||||
|
if (initialMememento == null)
|
||||||
|
initialMememento = memento;
|
||||||
|
else
|
||||||
|
diffs.Add(memento.GetDiffFor(GetLastSavedVersion()));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Revert(Employee emp)
|
||||||
|
{
|
||||||
|
EmployeeMemento em = GetLastSavedVersion();
|
||||||
|
|
||||||
|
if (diffs.Count > 0)
|
||||||
|
diffs.RemoveAt(diffs.Count - 1);
|
||||||
|
|
||||||
|
emp.Revert(em);
|
||||||
|
}
|
||||||
|
|
||||||
|
private EmployeeMemento GetLastSavedVersion()
|
||||||
|
{
|
||||||
|
var memento = initialMememento.Clone();
|
||||||
|
foreach (var diff in diffs)
|
||||||
|
{
|
||||||
|
memento.UpdateWithDelta(diff);
|
||||||
|
}
|
||||||
|
|
||||||
|
return memento;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
28
src/MememntoPattern/IterativeEmployee/Employee.cs
Normal file
28
src/MememntoPattern/IterativeEmployee/Employee.cs
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
using System.Collections.Generic;
|
||||||
|
|
||||||
|
namespace MememntoPattern.IterativeEmployee
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Originator
|
||||||
|
/// </summary>
|
||||||
|
public class Employee
|
||||||
|
{
|
||||||
|
public string Name { get; set; }
|
||||||
|
|
||||||
|
public string Address { get; set; }
|
||||||
|
|
||||||
|
public List<string> Phones { get; set; }
|
||||||
|
|
||||||
|
public EmployeeMemento Save()
|
||||||
|
{
|
||||||
|
return new EmployeeMemento(Name, Address);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Revert(EmployeeMemento memento)
|
||||||
|
{
|
||||||
|
Name = memento.Name;
|
||||||
|
|
||||||
|
Address = memento.Address;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,55 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace MememntoPattern.IterativeEmployee
|
||||||
|
{
|
||||||
|
public class EmployeeIterativeExample
|
||||||
|
{
|
||||||
|
public void Run()
|
||||||
|
{
|
||||||
|
Caretaker caretaker = new Caretaker();
|
||||||
|
Employee e = new Employee();
|
||||||
|
e.Name = "Ghiuri";
|
||||||
|
e.Address = "Stairway to heaven";
|
||||||
|
|
||||||
|
Console.WriteLine("First saved address: {0}", e.Address);
|
||||||
|
caretaker.Save(e);
|
||||||
|
|
||||||
|
e.Address = "Highway to hell";
|
||||||
|
|
||||||
|
Console.WriteLine("Second saved address: {0}", e.Address);
|
||||||
|
|
||||||
|
caretaker.Save(e);
|
||||||
|
|
||||||
|
e.Address = "Home of the brave";
|
||||||
|
|
||||||
|
Console.WriteLine("Third saved address: {0}", e.Address);
|
||||||
|
|
||||||
|
caretaker.Save(e);
|
||||||
|
|
||||||
|
e.Address = "Somesing";
|
||||||
|
|
||||||
|
Console.WriteLine("Address before revert: {0}", e.Address);
|
||||||
|
|
||||||
|
caretaker.Revert(e);
|
||||||
|
|
||||||
|
Console.WriteLine("First reverted Address: {0}", e.Address);
|
||||||
|
|
||||||
|
caretaker.Revert(e);
|
||||||
|
|
||||||
|
Console.WriteLine("Second reverted Address: {0}", e.Address);
|
||||||
|
|
||||||
|
caretaker.Revert(e);
|
||||||
|
|
||||||
|
Console.WriteLine("Third reverted Address: {0}", e.Address);
|
||||||
|
|
||||||
|
caretaker.Revert(e);
|
||||||
|
|
||||||
|
Console.WriteLine("Forth reverted Address: {0}", e.Address);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
51
src/MememntoPattern/IterativeEmployee/EmployeeMemento.cs
Normal file
51
src/MememntoPattern/IterativeEmployee/EmployeeMemento.cs
Normal file
@@ -0,0 +1,51 @@
|
|||||||
|
namespace MememntoPattern.IterativeEmployee
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Memento object
|
||||||
|
/// </summary>
|
||||||
|
public class EmployeeMemento : IIterativeMemento<EmployeeMemento, EmployeeMementoDiff>
|
||||||
|
{
|
||||||
|
public string Name { get; private set; }
|
||||||
|
public string Address { get; private set; }
|
||||||
|
|
||||||
|
public EmployeeMemento(string name, string address)
|
||||||
|
{
|
||||||
|
Name = name;
|
||||||
|
Address = address;
|
||||||
|
}
|
||||||
|
|
||||||
|
public EmployeeMementoDiff GetDiffFor(EmployeeMemento e)
|
||||||
|
{
|
||||||
|
EmployeeMementoDiff diff = new EmployeeMementoDiff();
|
||||||
|
|
||||||
|
if (Name != e.Name)
|
||||||
|
diff.UpdatedName = Name;
|
||||||
|
|
||||||
|
if (Address != e.Address)
|
||||||
|
diff.UpdatedAddress = Address;
|
||||||
|
|
||||||
|
return diff;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void UpdateWithDelta(EmployeeMementoDiff diff)
|
||||||
|
{
|
||||||
|
if (diff.UpdatedName != null)
|
||||||
|
Name = diff.UpdatedName;
|
||||||
|
|
||||||
|
if (diff.UpdatedAddress != null)
|
||||||
|
Address = diff.UpdatedAddress;
|
||||||
|
}
|
||||||
|
|
||||||
|
public EmployeeMemento Clone()
|
||||||
|
{
|
||||||
|
return new EmployeeMemento(Name, Address);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public class EmployeeMementoDiff
|
||||||
|
{
|
||||||
|
public string UpdatedName { get; set; }
|
||||||
|
|
||||||
|
public string UpdatedAddress { get; set; }
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
namespace MememntoPattern.IterativeEmployee
|
||||||
|
{
|
||||||
|
public interface IIterativeMemento<TMemento, TDiff>
|
||||||
|
{
|
||||||
|
TMemento Clone();
|
||||||
|
TDiff GetDiffFor(TMemento e);
|
||||||
|
void UpdateWithDelta(TDiff diff);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,5 +1,6 @@
|
|||||||
using MememntoPattern.Employee;
|
using MememntoPattern.Employee;
|
||||||
using MememntoPattern.EmployeeSerialized;
|
using MememntoPattern.EmployeeSerialized;
|
||||||
|
using MememntoPattern.IterativeEmployee;
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
@@ -28,6 +29,10 @@ namespace MememntoPattern
|
|||||||
|
|
||||||
GoToNextStep();
|
GoToNextStep();
|
||||||
|
|
||||||
|
EmployeeIterativeExample empIterEx = new EmployeeIterativeExample();
|
||||||
|
empIterEx.Run();
|
||||||
|
GoToNextStep();
|
||||||
|
|
||||||
Console.WriteLine(GetPitfalls());
|
Console.WriteLine(GetPitfalls());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user