🦁

Memento

2023/09/10に公開

Memento パターンは、オブジェクトの内部状態をキャプチャし、後でそのオブジェクトをその状態に戻す方法を提供するデザインパターンです。これにより、オブジェクトの状態を変更した後でも、変更を元に戻す(アンドゥ)操作が可能になります。

主要な構成要素:

  1. Originator (発行者): 状態を持つオブジェクト。Mementoを作成し、前の状態に戻すためにそれを使用します。
  2. Memento (記念品): Originatorの内部状態のスナップショットを保持するオブジェクト。
  3. Caretaker (保管者): Mementoの保管と状態の復元を管理するオブジェクト。

例:

テキストエディタでの編集履歴を考えてみましょう。

  1. Originator:

    class TextEditor:
        def __init__(self, content=""):
            self.content = content
    
        def create_memento(self):
            return TextMemento(self.content)
    
        def restore(self, memento):
            self.content = memento.content
    
    
  2. Memento:

    class TextMemento:
        def __init__(self, content):
            self.content = content
    
    
  3. Caretaker:

    class History:
        def __init__(self):
            self._history = []
    
        def save_state(self, editor):
            self._history.append(editor.create_memento())
    
        def undo(self, editor):
            if not self._history:
                return
    
            memento = self._history.pop()
            editor.restore(memento)
    
    

使用方法:

    editor = TextEditor("Hello, World!")
    history = History()

    history.save_state(editor)
    editor.content = "Hello, Memento!"
    history.save_state(editor)

    editor.content = "Hello, Final Version!"
    print(editor.content)  # Hello, Final Version!

    history.undo(editor)
    print(editor.content)  # Hello, Memento!

    history.undo(editor)
    print(editor.content)  # Hello, World!

利点:

  1. アンドゥ機能: Memento パターンを使用すると、オブジェクトの状態の変更を容易に元に戻すことができます。
  2. カプセル化の維持: Originatorの状態は完全にカプセル化されており、Caretakerは状態に直接アクセスすることなくMementoを使用して状態を保存および復元できます。

Memento パターンは、オブジェクトの状態の変更を追跡し、必要に応じてその変更を元に戻す必要がある場合に特に有用です。

Discussion