<一覧に戻る

メメントパターン

メメントパターンは、オブジェクトの状態を保存しておき、必要に応じてその状態を復元するためのデザインパターンです。このパターンは、特にUndo操作を実装する際に役立ちます。

メメントパターンの構成要素

メメントパターンは、以下の3つの主要なコンポーネントで構成されます。

  1. Originator(オリジネーター): 状態を持つオブジェクトで、メメントを作成し、復元します。
  2. Memento(メメント): オリジネーターの状態を保存するオブジェクトです。
  3. Caretaker(ケアテイカー): メメントを管理し、必要に応じてオリジネーターに渡します。

サンプルコード

以下に、メメントパターンを用いたシンプルなテキストエディタの例を示します。このエディタでは、ユーザーが入力したテキストの状態を保存し、Undo機能を実装します。

ステップ 1: Memento クラスの作成

まず、メメントクラスを作成します。このクラスは、オリジネーターの状態を保存します。

class Memento:
    def __init__(self, state):
        self._state = state

    def get_state(self):
        return self._state

解説

  • Mementoクラスには、状態を保存するための_state属性があります。
  • get_stateメソッドを使って、保存された状態を取得することができます。

ステップ 2: Originator クラスの作成

次に、オリジネータークラスを作成します。このクラスは、自身の状態を管理し、メメントを作成します。

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メソッドを使って、渡されたメメントから状態を復元します。

ステップ 3: Caretaker クラスの作成

次に、ケアテイカークラスを作成します。このクラスは、メメントを管理します。

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メソッドで特定のメメントを取得します。

ステップ 4: 実行例

最後に、これらのクラスを使ってメメントパターンを実行してみましょう。

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())

解説

  • TextEditorCaretakerのインスタンスを作成します。
  • テキストを設定し、その都度メメントを作成してケアテイカーに保存します。
  • 最後に、Undo操作を実行し、保存した状態に復元しています。

このように、メメントパターンを使用すると、オブジェクトの状態を簡単に保存および復元できるため、Undo機能などが実装しやすくなります。

出力結果: