Advertisement
Temabowl

pattern_snapshot

Mar 11th, 2022
194
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.43 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Threading;
  4. using System.Linq;
  5.  
  6.  
  7. namespace lab_11
  8. {
  9. class Program
  10. {
  11. static void Main(string[] args)
  12. {
  13. // Клиентский код.
  14. Originator originator = new Originator("Super-duper-super-puper-super.");
  15. Caretaker caretaker = new Caretaker(originator);
  16.  
  17. caretaker.Backup();
  18. originator.DoSomething();
  19.  
  20. caretaker.Backup();
  21. originator.DoSomething();
  22.  
  23. caretaker.Backup();
  24. originator.DoSomething();
  25.  
  26. Console.WriteLine();
  27. caretaker.ShowHistory();
  28.  
  29. Console.WriteLine("\nClient: Now, let's rollback!\n");
  30. caretaker.Undo();
  31.  
  32. Console.WriteLine("\n\nClient: Once more!\n");
  33. caretaker.Undo();
  34.  
  35. Console.WriteLine();
  36. }
  37. }
  38. class Originator
  39. {
  40. // Для удобства состояние создателя хранится внутри одной переменной.
  41. private string _state;
  42.  
  43. public Originator(string state)
  44. {
  45. this._state = state;
  46. Console.WriteLine("Originator: My initial state is: " + state);
  47. }
  48.  
  49. // Бизнес-логика Создателя может повлиять на его внутреннее состояние.
  50. // Поэтому клиент должен выполнить резервное копирование состояния с
  51. // помощью метода save перед запуском методов бизнес-логики.
  52. public void DoSomething()
  53. {
  54. Console.WriteLine("Originator: I'm doing something important.");
  55. this._state = this.GenerateRandomString(30);
  56. Console.WriteLine($"Originator: and my state has changed to: {_state}");
  57. }
  58.  
  59. private string GenerateRandomString(int length = 10)
  60. {
  61. string allowedSymbols = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
  62. string result = string.Empty;
  63.  
  64. while (length > 0)
  65. {
  66. result += allowedSymbols[new Random().Next(0, allowedSymbols.Length)];
  67.  
  68. Thread.Sleep(12);
  69.  
  70. length--;
  71. }
  72.  
  73. return result;
  74. }
  75.  
  76. // Сохраняет текущее состояние внутри снимка.
  77. public IMemento Save()
  78. {
  79. return new ConcreteMemento(this._state);
  80. }
  81.  
  82. // Восстанавливает состояние Создателя из объекта снимка.
  83. public void Restore(IMemento memento)
  84. {
  85. if (!(memento is ConcreteMemento))
  86. {
  87. throw new Exception("Unknown memento class " + memento.ToString());
  88. }
  89.  
  90. this._state = memento.GetState();
  91. Console.Write($"Originator: My state has changed to: {_state}");
  92. }
  93. }
  94. public interface IMemento
  95. {
  96. string GetName();
  97.  
  98. string GetState();
  99.  
  100. DateTime GetDate();
  101. }
  102.  
  103. // Конкретный снимок содержит инфраструктуру для хранения состояния
  104. // Создателя.
  105. class ConcreteMemento : IMemento
  106. {
  107. private string _state;
  108.  
  109. private DateTime _date;
  110.  
  111. public ConcreteMemento(string state)
  112. {
  113. this._state = state;
  114. this._date = DateTime.Now;
  115. }
  116.  
  117. // Создатель использует этот метод, когда восстанавливает своё
  118. // состояние.
  119. public string GetState()
  120. {
  121. return this._state;
  122. }
  123.  
  124. // Остальные методы используются Опекуном для отображения метаданных.
  125. public string GetName()
  126. {
  127. return $"{this._date} / ({this._state.Substring(0, 9)})...";
  128. }
  129.  
  130. public DateTime GetDate()
  131. {
  132. return this._date;
  133. }
  134. }
  135. class Caretaker
  136. {
  137. private List<IMemento> _mementos = new List<IMemento>();
  138.  
  139. private Originator _originator = null;
  140.  
  141. public Caretaker(Originator originator)
  142. {
  143. this._originator = originator;
  144. }
  145.  
  146. public void Backup()
  147. {
  148. Console.WriteLine("\nCaretaker: Saving Originator's state...");
  149. this._mementos.Add(this._originator.Save());
  150. }
  151.  
  152. public void Undo()
  153. {
  154. if (this._mementos.Count == 0)
  155. {
  156. return;
  157. }
  158.  
  159. var memento = this._mementos.Last();
  160. this._mementos.Remove(memento);
  161.  
  162. Console.WriteLine("Caretaker: Restoring state to: " + memento.GetName());
  163.  
  164. try
  165. {
  166. this._originator.Restore(memento);
  167. }
  168. catch (Exception)
  169. {
  170. this.Undo();
  171. }
  172. }
  173.  
  174. public void ShowHistory()
  175. {
  176. Console.WriteLine("Caretaker: Here's the list of mementos:");
  177.  
  178. foreach (var memento in this._mementos)
  179. {
  180. Console.WriteLine(memento.GetName());
  181. }
  182. }
  183. }
  184. }
  185.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement