メメントパターン:オブジェクトの状態を保存・復元する

概要

メメントパターンは、オブジェクトの内部状態を捕捉し、そのオブジェクトの外部に保存することで、後でそのオブジェクトを以前の状態に復元できるようにするデザインパターンです。このプロセスは、オブジェクトのカプセル化を破壊することなく行われます。

使用シーン

1. オブジェクトの特定の時点における状態を保存し、後でその状態に復元する必要がある場合。

2. 状態を直接取得するインターフェースを公開すると、オブジェクトの実装詳細が漏洩し、カプセル化が破壊される場合。

コード例

以下は、メメントパターンを実装するための基本的なクラス構造の例です。この例では、テキストドキュメントの状態を保存・復元するシナリオを想定しています。

1. スナップショットクラス

オブジェクトの状態を保持するクラスです。


  /// <summary>
  /// スナップショットクラス
  /// </summary>
  class Snapshot
  {
      private readonly string _content;

      public Snapshot(string content)
      {
          _content = content;
      }

      public string Content
      {
          get { return _content; }
      }
  }
  

2. ドキュメントクラス(状態の所有者)

状態を管理し、スナップショットを作成・復元するクラスです。


  /// <summary>
  /// ドキュメントクラス
  /// </summary>
  class Document
  {
      private string _currentContent;

      public string CurrentContent
      {
          get { return _currentContent; }
          set { _currentContent = value; }
      }

      /// <summary>
      /// 現在の状態をスナップショットとして保存する
      /// </summary>
      /// <returns>作成されたスナップショット</returns>
      public Snapshot CreateSnapshot()
      {
          return new Snapshot(_currentContent);
      }

      /// <summary>
      /// スナップショットから状態を復元する
      /// </summary>
      /// <param name="snapshot">復元元のスナップショット</param>
      public void RestoreFromSnapshot(Snapshot snapshot)
      {
          _currentContent = snapshot.Content;
      }

      /// <summary>
      /// 現在の状態を表示する
      /// </summary>
      public void Display()
      {
          Console.WriteLine("現在の内容: " + _currentContent);
      }
  }
  

3. 履歴管理クラス

スナップショットを管理するクラスです。


  /// <summary>
  /// 履歴管理クラス
  /// </summary>
  class History
  {
      private Snapshot _latestSnapshot;

      public Snapshot LatestSnapshot
      {
          get { return _latestSnapshot; }
          set { _latestSnapshot = value; }
      }
  }
  

4. クライアントコード

パターンの使用方法を示すテストコードです。


  static void Main(string[] args)
  {
      Document doc = new Document();
      doc.CurrentContent = "Hello"; // 初期状態
      doc.Display();

      History history = new History();
      history.LatestSnapshot = doc.CreateSnapshot(); // 状態を保存

      doc.CurrentContent = "World"; // 状態を変更
      doc.Display();

      doc.RestoreFromSnapshot(history.LatestSnapshot); // 保存した状態に復元
      doc.Display();

      Console.ReadKey();
  }
  

タグ: メメントパターン C# 状態管理

7月22日 22:54 投稿