Знімок (шаблон проєктування)

Зні́мок (англ. Memento) — це шаблон проєктування, що належить до класу шаблонів поведінки і забезпечує можливість відновлення об'єкта до збереженого (попереднього) стану.

Призначення ред.

Не порушуючи інкапсуляції, фіксує та виносить за межі об'єкта його внутрішній стан так, щоб пізніше можна було відновити з нього об'єкт.

Застосування ред.

Слід використовувати шаблон Знімок у випадках, коли:

  • необхідно зберегти миттєвий знімок стану об'єкта (або його частини), щоб згодом об'єкт можна було відтворити у тому ж самому стані;
  • безпосереднє вилучення цього стану розкриває деталі реалізації та порушує інкапсуляцію об'єкта.

Структура ред.

 
UML діаграма, що описує структуру шаблону проєктування Знімок
  • Memento — контекст:
    • зберігає внутрішній стан об'єкта Originator. Обсяг інформації, що зберігається, може бути різним та визначається потребами хазяїна;
    • забороняє доступ усім іншим об'єктам окрім хазяїна. По суті знімок має два інтерфейси. Опікун Caretaker користується лише вузьким інтерфейсом знімку — він може лише передавати знімок іншим об'єктам. Навпаки, хазяїн користується широким інтерфейсом, котрий забезпечує доступ до всіх даних, необхідних для відтворення об'єкта (чи його частини) у попередньому стані. Ідеальний варіант — коли тільки хазяїну, що створив знімок, відкритий доступ до внутрішнього стану знімку;
  • Originator — хазяїн:
    • створює знімок, що утримує поточний внутрішній стан;
    • використовує знімок для відтворення внутрішнього стану;
  • CareTaker — опікун:
    • відповідає за зберігання знімка;
    • не проводить жодних операцій над знімком та не має уявлення про його внутрішній зміст.

Відносини ред.

 
UML діаграма, що описує відносини між об'єктами шаблону проєктування Знімок
  • опікун запитує знімок у хазяїна, деякий час тримає його у себе, опісля повертає хазяїну. Іноді цього не відбувається, бо хазяїн не має необхідності відтворювати свій попередній стан;
  • знімки пасивні. Тільки хазяїн, що створив знімок, має доступ до інформації про стан.

Переваги ред.

  • Забезпечує спосіб запису внутрішнього стану об'єкта в окремому об'єкті, не порушуючи закону дизайну.
  • Усуває потребу в багаторазовому створенні того ж об'єкта з єдиною метою збереження його стану.
  • Спрощує Originator, даючи відповідальність за зберігання Memento серед Caretaker.

Недоліки ред.

  • Збереження та відновлення стану може зайняти багато часу.
  • Об'єкт Memento повинен забезпечувати два типи інтерфейсів: вузький інтерфейс для Caretaker і широкий інтерфейс для Originator.
  • Дозволяє іншому об'єкту довільно змінити стан об'єкта

Реалізація ред.

C++ ред.

Джерела ред.

Література ред.

Алан Шаллоуей, Джеймс Р. Тротт. Шаблоны проектирования. Новый подход к объектно-ориентированному анализу и проектированию = Design Patterns Explained: A New Perspective on Object-Oriented Design. — М. : «Вильямс», 2002. — 288 с. — ISBN 0-201-71594-5.