-
Notifications
You must be signed in to change notification settings - Fork 0
/
Program.cs
119 lines (108 loc) · 2.8 KB
/
Program.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
/* Хранитель + Одиночка
Не нарушая инкапсуляцию, определяет
и сохраняет внутреннее состояние объекта и
позволяет позже восстановить объект в этом
состоянии
*/
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();
}
}