Паттерн: Снимок (Memento)
1️⃣ Как кратко ответить
Паттерн "Снимок" (Memento) используется для сохранения и восстановления состояния объекта без нарушения инкапсуляции. Он позволяет откатить объект к предыдущему состоянию, сохраняя историю изменений. Это полезно в приложениях, где требуется возможность отмены действий или восстановления предыдущих состояний.
2️⃣ Подробное объяснение темы
Паттерн "Снимок" (Memento) — это поведенческий паттерн проектирования, который позволяет сохранять и восстанавливать состояние объекта, не нарушая его инкапсуляцию. Это значит, что мы можем сохранить текущее состояние объекта и позже восстановить его, не раскрывая внутренние детали реализации объекта.
Зачем это нужно?
Представьте себе текстовый редактор, в котором вы можете отменять и повторять изменения. Каждый раз, когда вы вносите изменения, редактор сохраняет текущее состояние документа. Если вы решите отменить изменения, редактор просто восстанавливает предыдущее состояние. Паттерн "Снимок" идеально подходит для таких случаев, где требуется возможность отката изменений.
Где применяется?
- Текстовые редакторы: для реализации функций отмены и повтора.
- Игры: для сохранения состояния игры, чтобы игрок мог вернуться к предыдущему моменту.
- Базы данных: для реализации транзакций и отката изменений.
- Приложения с сложными состояниями: где требуется возможность восстановления предыдущих состояний.
Как работает?
Паттерн "Снимок" состоит из трех основных компонентов:
- Originator (Создатель): объект, состояние которого нужно сохранить. Он создает снимок и может восстановить своё состояние из него.
- Memento (Снимок): объект, который хранит состояние
Originator. Он не раскрывает внутренние детали состояния. - Caretaker (Хранитель): объект, который управляет снимками. Он знает, когда нужно создать снимок и когда восстановить состояние, но не знает, как это делается.
Пример на Python
Давайте рассмотрим простой пример, чтобы понять, как это работает:
class Memento:
def __init__(self, state):
self._state = state
def get_state(self):
return self._state
class Originator:
def __init__(self):
self._state = None
def set_state(self, state):
print(f"Setting state to {state}")
self._state = state
def save_to_memento(self):
print("Saving to Memento.")
return Memento(self._state)
def restore_from_memento(self, memento):
self._state = memento.get_state()
print(f"State restored to {self._state}")
class Caretaker:
def __init__(self):
self._mementos = []
def add_memento(self, memento):
self._mementos.append(memento)
def get_memento(self, index):
return self._mementos[index]
# Пример использования
originator = Originator()
caretaker = Caretaker()
originator.set_state("State1")
caretaker.add_memento(originator.save_to_memento())
originator.set_state("State2")
caretaker.add_memento(originator.save_to_memento())
originator.set_state("State3")
# Восстановление состояния
originator.restore_from_memento(caretaker.get_memento(0))
Как это работает?
- Создатель (Originator) устанавливает состояние и может сохранять его в объекте
Memento. - Снимок (Memento) хранит состояние, предоставляя метод для его получения.
- Хранитель (Caretaker) управляет снимками, сохраняя их и предоставляя доступ к ним для восстановления состояния.
🔒 Подпишись на бусти автора и стань Алигатором, чтобы получить полный доступ к функционалу сайта и отслеживать свой прогресс!
Подписаться