/* Хранитель + Одиночка
Не нарушая инкапсуляцию, определяет
и сохраняет внутреннее состояние объекта и
позволяет позже восстановить объект в этом
состоянии
*/
class Program
{
public static void Main(string[] args)
{
#region Пример №1 - базовое
using (var hero = new Hero())
{
hero.Shoot();
}
using (var heroMan = new Hero())
{
heroMan.RestoreState(GameHistory.Instance.History.Pop());
heroMan.Shoot();
}
Console.ReadKey();
#endregion
}
}
///
/// Класс героя
///
class Hero : IDisposable
{
///
/// Количество патронов
///
private int patrons = 10;
///
/// Выстрел
///
public void Shoot()
{
if(patrons > 0)
{
patrons--;
Console.WriteLine($"Осталось {patrons} патронов...");
}
else
Console.WriteLine("Нет патронов");
}
///
/// Сохранение состояния
///
///
public HeroMemento SaveState()
{
Console.WriteLine($"Сохранено - {patrons}");
return new HeroMemento(patrons);
}
///
/// Восстановление состояния
///
/// Хранитель состояния
public void RestoreState(HeroMemento memento)
{
patrons = memento.Patrons;
Console.WriteLine($"Загружено - {patrons}");
}
///
/// Удаление из памяти + сохранение в истории последнего состояния
///
public void Dispose()
{
GameHistory.Instance.History.Push(SaveState());
}
}
///
/// Memento - Хранитель состояния
///
class HeroMemento
{
public int Patrons { get; private set; }
public HeroMemento(int patrons)
{
Patrons = patrons;
}
}
///
/// Caretaker - смотритель состояния
///
class GameHistory
{
private static GameHistory instance;
public Stack History { get; set; }
private GameHistory()
{
History = new Stack();
}
public static GameHistory Instance
{
get
{
if(instance == null)
instance = new GameHistory();
return instance;
}
}
public void Clear()
{
History.Clear();
}
}