119 lines
2.8 KiB
C#
119 lines
2.8 KiB
C#
/* Хранитель + Одиночка
|
||
Не нарушая инкапсуляцию, определяет
|
||
и сохраняет внутреннее состояние объекта и
|
||
позволяет позже восстановить объект в этом
|
||
состоянии
|
||
*/
|
||
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
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// Класс героя
|
||
/// </summary>
|
||
class Hero : IDisposable
|
||
{
|
||
/// <summary>
|
||
/// Количество патронов
|
||
/// </summary>
|
||
private int patrons = 10;
|
||
|
||
/// <summary>
|
||
/// Выстрел
|
||
/// </summary>
|
||
public void Shoot()
|
||
{
|
||
if(patrons > 0)
|
||
{
|
||
patrons--;
|
||
Console.WriteLine($"Осталось {patrons} патронов...");
|
||
}
|
||
else
|
||
Console.WriteLine("Нет патронов");
|
||
}
|
||
|
||
/// <summary>
|
||
/// Сохранение состояния
|
||
/// </summary>
|
||
/// <returns></returns>
|
||
public HeroMemento SaveState()
|
||
{
|
||
Console.WriteLine($"Сохранено - {patrons}");
|
||
return new HeroMemento(patrons);
|
||
}
|
||
|
||
/// <summary>
|
||
/// Восстановление состояния
|
||
/// </summary>
|
||
/// <param name="memento">Хранитель состояния</param>
|
||
public void RestoreState(HeroMemento memento)
|
||
{
|
||
patrons = memento.Patrons;
|
||
Console.WriteLine($"Загружено - {patrons}");
|
||
}
|
||
|
||
/// <summary>
|
||
/// Удаление из памяти + сохранение в истории последнего состояния
|
||
/// </summary>
|
||
public void Dispose()
|
||
{
|
||
GameHistory.Instance.History.Push(SaveState());
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// Memento - Хранитель состояния
|
||
/// </summary>
|
||
class HeroMemento
|
||
{
|
||
public int Patrons { get; private set; }
|
||
|
||
public HeroMemento(int patrons)
|
||
{
|
||
Patrons = patrons;
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// Caretaker - смотритель состояния
|
||
/// </summary>
|
||
class GameHistory
|
||
{
|
||
private static GameHistory instance;
|
||
public Stack<HeroMemento> History { get; set; }
|
||
|
||
private GameHistory()
|
||
{
|
||
History = new Stack<HeroMemento>();
|
||
}
|
||
|
||
public static GameHistory Instance
|
||
{
|
||
get
|
||
{
|
||
if(instance == null)
|
||
instance = new GameHistory();
|
||
return instance;
|
||
}
|
||
}
|
||
|
||
public void Clear()
|
||
{
|
||
History.Clear();
|
||
}
|
||
} |