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

Матеріал з Вікіпедії — вільної енциклопедії.
Перейти до: навігація, пошук

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


  1. Будай, Андрій (2012). Дизайн-патерни — просто, як двері (Українською). с. 90.