メメントパターンは、オブジェクトの状態を保存しておき、必要に応じてその状態を復元するためのデザインパターンです。このパターンは、特にUndo操作を実装する際に役立ちます。
メメントパターンは、以下の3つの主要なコンポーネントで構成されます。
以下に、メメントパターンを用いたシンプルなテキストエディタの例を示します。このエディタでは、ユーザーが入力したテキストの状態を保存し、Undo機能を実装します。
まず、メメントクラスを作成します。このクラスは、オリジネーターの状態を保存します。
class Memento:
def __init__(self, state):
self._state = state
def get_state(self):
return self._state
Memento
クラスには、状態を保存するための_state
属性があります。get_state
メソッドを使って、保存された状態を取得することができます。次に、オリジネータークラスを作成します。このクラスは、自身の状態を管理し、メメントを作成します。
class TextEditor:
def __init__(self):
self._text = ""
def set_text(self, text):
self._text = text
def get_text(self):
return self._text
def create_memento(self):
return Memento(self._text)
def restore(self, memento):
self._text = memento.get_state()
TextEditor
クラスは、テキストエディタの状態(テキスト)を保持します。set_text
メソッドでテキストを設定し、get_text
メソッドでテキストを取得します。create_memento
メソッドで現在のテキストの状態を保存するメメントを作成します。restore
メソッドを使って、渡されたメメントから状態を復元します。次に、ケアテイカークラスを作成します。このクラスは、メメントを管理します。
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]
Caretaker
クラスは、メメントをリストで管理します。add_memento
メソッドでメメントをリストに追加し、get_memento
メソッドで特定のメメントを取得します。最後に、これらのクラスを使ってメメントパターンを実行してみましょう。
if __name__ == "__main__":
editor = TextEditor()
caretaker = Caretaker()
editor.set_text("Hello")
caretaker.add_memento(editor.create_memento())
editor.set_text("Hello World")
caretaker.add_memento(editor.create_memento())
editor.set_text("Hello World!")
print("Current Text:", editor.get_text())
# Undo operation
editor.restore(caretaker.get_memento(1))
print("After Undo:", editor.get_text())
# Undo to the previous state
editor.restore(caretaker.get_memento(0))
print("After Undo again:", editor.get_text())
TextEditor
とCaretaker
のインスタンスを作成します。このように、メメントパターンを使用すると、オブジェクトの状態を簡単に保存および復元できるため、Undo機能などが実装しやすくなります。