Design Pattern | Memento Pattern(メメントパターン)

Mementoパターンとは?

  • Mementoという英単語は記念品形見思い出の品という意味である。
  • オブジェクト指向プログラムでUndoを行うには、インスタンスが持つ情報を保存しなければならない。
  • インスタンスを復元するには、インスタンス内部の情報へ自由にアクセスできる必要がある。しかし、不注意にアクセスを許可すると、そのクラスの内部構造に依存したコードになってしまう。これをカプセル化の破壊と言う。
  • Mementoパターンは、インスタンスの状態を表す役割を導入し、カプセル化を壊さずに状態(以前のインスタンス)の保存/復元を行う方式である。
  • GoFのデザインパターンでは、振る舞いに関するデザインパターンに分類される。

Mementoパターンのサンプルプログラム

投げたサイコロの数に応じて所持金と所持品(果物)を変化させるプログラムである。
状況に応じて保存と復元を行う。

Class Diagram
Memento Pattern Class Diagram

例では、ゲーム状態を表すMementoクラス、状態を変化させるGamerクラス、条件が良いときにスナップショットを保存し、悪いときに復元するMainクラスを使う。

メリット

Mementoを使うと、オブジェクトの内部構造を公開せずに状態を保存できる。Undo、ロールバック、チェックポイント、復旧機能を実装するときに、カプセル化を保ちやすい。