certain-design-patterns/memento.py

40 lines
1.7 KiB
Python

from abc import ABC, abstractmethod
class IMemento(ABC):
@abstractmethod
def get_state(self): pass
class Memento(IMemento):
"""Класс Снимок, который хранит состояние объекта."""
def __init__(self, state): self._state = state
def get_state(self): return self._state
class TextEditor:
"""Класс текстового редактора, который изменяет свое состояние."""
def __init__(self): self._text = ""
def write(self, text): self._text += text
def get_text(self): return self._text
def save(self):
"""Сохраняем текущее состояние в снимок."""
return Memento(self._text)
def restore(self, memento):
"""Восстанавливаем состояние из снимка."""
self._text = memento.get_state()
class Caretaker:
"""Класс Хранитель, который управляет сохранением и восстановлением снимков."""
def __init__(self): self._mementos = []
def save_memento(self, memento): self._mementos.append(memento)
def get_memento(self, index): return self._mementos[index]
editor, caretaker = TextEditor(), Caretaker()
# Пишем текст и сохраняем состояние
editor.write("Hello, ")
caretaker.save_memento(editor.save())
editor.write("world!")
caretaker.save_memento(editor.save())
print("Текущий текст:", editor.get_text()) # Вывод: Hello, world!
# Восстанавливаем предыдущее состояние
editor.restore(caretaker.get_memento(0))
print("После восстановления:", editor.get_text()) # Вывод: Hello,