40 lines
1.7 KiB
Python
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,
|