Зні́мок () — це шаблон проєктування, що належить до класу шаблонів поведінки і забезпечує можливість відновлення об'єкта до збереженого (попереднього) стану.
Призначення Не порушуючи інкапсуляції, фіксує та виносить за межі об'єкта його внутрішній стан так, щоб пізніше можна було відновити з нього об'єкт.
Застосування Слід використовувати шаблон Знімок у випадках, коли: необхідно зберегти миттєвий знімок стану об'єкта (або його частини), щоб згодом об'єкт можна було відтворити у тому ж самому стані; безпосереднє вилучення цього стану розкриває деталі реалізації та порушує інкапсуляцію об'єкта.
Структура
Memento — контекст: зберігає внутрішній стан об'єкта Originator. Обсяг інформації, що зберігається, може бути різним та визначається потребами хазяїна; забороняє доступ усім іншим об'єктам окрім хазяїна. По суті знімок має два інтерфейси. Опікун Caretaker користується лише вузьким інтерфейсом знімку — він може лише передавати знімок іншим об'єктам. Навпаки, хазяїн користується широким інтерфейсом, котрий забезпечує доступ до всіх даних, необхідних для відтворення об'єкта (чи його частини) у попередньому стані. Ідеальний варіант — коли тільки хазяїну, що створив знімок, відкритий доступ до внутрішнього стану знімку; Originator — хазяїн: створює знімок, що утримує поточний внутрішній стан; використовує знімок для відтворення внутрішнього стану; CareTaker — опікун: відповідає за зберігання знімка; не проводить жодних операцій над знімком та не має уявлення про його внутрішній зміст.
Відносини
опікун запитує знімок у хазяїна, деякий час тримає його у себе, опісля повертає хазяїну. Іноді цього не відбувається, бо хазяїн не має необхідності відтворювати свій попередній стан; знімки пасивні. Тільки хазяїн, що створив знімок, має доступ до інформації про стан.
Переваги Забезпечує спосіб запису внутрішнього стану об'єкта в окремому об'єкті, не порушуючи закону дизайну. Усуває потребу в багаторазовому створенні того ж об'єкта з єдиною метою збереження його стану. Спрощує Originator, даючи відповідальність за зберігання Memento серед Caretaker.
Недоліки Збереження та відновлення стану може зайняти багато часу. Об'єкт Memento повинен забезпечувати два типи інтерфейсів: вузький інтерфейс для Caretaker і широкий інтерфейс для Originator. Дозволяє іншому об'єкту довільно змінити стан об'єкта
Реалізація
C++
Джерела
Андрій Будай Дизайн-патерни — просто, як двері . — 2012. — 90 с.