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

Зні́мок (англ. 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.


This article is issued from Wikipedia. The text is licensed under Creative Commons - Attribution - Sharealike. Additional terms may apply for the media files.