Memento

メメントパターンは、オブジェクトの状態を以前の状態に戻せるように、スナップショットを取ることができるデザインパターンです。これにより、オブジェクトの状態のバックアップを取り、必要に応じてその状態を復元できます。これはアンドゥやリドゥの機能、またはチェックポイントの作成に役立ちます。

使用シーン

メメントパターンは以下のような場合に特に有用です:

  1. オブジェクトの状態をある時点で保存して、後でその状態に戻せるようにしたい場合

    • エディタのアンドゥ機能や、ゲームのチェックポイントシステムなどが該当します。

  2. オブジェクトの直接的な内部状態へのアクセスを防ぎつつ、状態を保存・復元したい場合

    • カプセル化を破壊せずに状態を管理したいときに有効です。

メリットとデメリット

メリット

  • カプセル化の維持:オブジェクトの内部状態に外部から直接アクセスすることなく、状態の保存と復元が可能です。

  • 履歴の管理:オブジェクトの状態の履歴を保存して、任意の時点に戻ることができます。

デメリット

  • リソースの消費:多くのメメントを保持するとメモリ使用量が増加することがあります。

  • クラス設計:オブジェクトが複雑で状態が多い場合、メメントを作成することが面倒になることがあります。

サンプルコード(Python)

以下は、エディタの状態を保存し、後でその状態に戻せるメメントパターンの実装例です。

class Memento:
    """エディタの状態を保存するためのメメントクラス"""
    
    def __init__(self, state):
        self._state = state

    def get_saved_state(self):
        return self._state

class Editor:
    """テキストを編集するエディタのクラス"""

    def __init__(self):
        self._content = ""

    def set_content(self, content):
        self._content = content

    def save(self):
        return Memento(self._content)

    def restore(self, memento):
        self._content = memento.get_saved_state()

    def __str__(self):
        return self._content

# クライアントコード
editor = Editor()

# テキストを設定し、状態を保存
editor.set_content("State1")
saved_state = editor.save()

# 状態を変更
editor.set_content("State2")

# 元の状態に戻す
editor.restore(saved_state)
print(editor)  # "State1" が出力される

このコード例では、Editor クラスが編集中のテキストの状態を持っており、Memento クラスを使用してその状態を保存します。Editor クラスの save メソッドは現在の状態を Memento オブジェクトとして保存し、restore メソッドはメメントから状態を復元します。

クライアントコードでは、エディタの状態を変更した後で保存したメメントを使って元の状態に戻しています。このようにメメントパターンを使用すると、エディタの状態の変更履歴を管理し、任意の時点に戻すことが容易になります。

この記事が気に入ったらサポートをしてみませんか?