PatternsCSharpProgramming/Patterns/Memento/Program.cs
Dvurechensky 3a28caed27 1.0
Main
2024-10-05 09:15:54 +03:00

119 lines
2.8 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/* Хранитель + Одиночка
Не нарушая инкапсуляцию, определяет
и сохраняет внутреннее состояние объекта и
позволяет позже восстановить объект в этом
состоянии
*/
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();
}
}