【めめんとぱたーん】
Mementoパターン とは?
最終更新:
💡 内部状態を隠したまま、保存して戻す
内部状態を外部に公開せず保存し、後で復元できるようにするデザインパターン。Originator・Memento・Caretaker、Undoとの関係、保存範囲と負担を解説します。
📌 このページのポイント
- オブジェクトの状態を保存し、後から復元する設計
- 状態の保存・復元はOriginatorが担当する
- Caretakerは保存物を管理し、中身を直接書き換えない
- Undoの実装等に使えるが、外部への影響までは自動で戻さない
変更する前の状態に、戻したい!
誰が、状態を保存する?
状態を持つOriginatorが、自分の状態からMementoを作るよ。Caretakerは、いつ保存や復元が必要かを管理し、保存物を保管する。復元するときは、保存物をOriginatorに渡して戻してもらうんだ。
Caretakerが、中の値を直してもよい?
内部状態を直接読んだり書き換えたりせず、Originatorに任せるのが要点だよ。保存の中身と、その管理を分けてカプセル化を保つ。どんな情報を保存し、誰から触れるようにするかは、言語や実装で決めるんだ。
参照を一つ保存するだけでよい?
同じ変更可能なオブジェクトを参照しているだけだと、変更前の値も変わってしまうことがあるよ。保存時点の必要な状態を保てるようにする。値のコピーや変更しない構造など、状態の持ち方に合う方法を設計しよう。
保存すれば、何でも元に戻る?
もっと詳しく知りたい人へ
Mementoを作るだけで、Redoも完成する?
変更後の状態も残す、履歴の現在位置を管理する、Undo後の新しい操作でどの履歴を残すか決める、といった処理が別に必要です。Mementoは状態の保存・復元を支えますが、履歴操作の仕様をすべて決めるものではありません。
ゲームの保存やファイルのバックアップは、全部Memento?
保存して戻す考え方は似ていますが、それだけでは同じパターンとは限りません。内部状態の保存・復元を持ち主に任せ、保存物を管理する側が中身へ直接依存しない、という役割と目的を確認します。ディスクへの永続化も別に設計します。
まとめ:ざっくりこれだけ覚えればOK!
「Mementoパターン」って出てきたら「内部状態を隠したまま保存し、あとで戻せるようにする設計」と思えばだいたいOK!
📖 おまけ:英語の意味
「Memento Pattern」 = 状態の保存物を使うデザインパターン
💬 Mementoは記念品や思い出の品を指す言葉です。このパターンでは、あとで状態を復元するための保存物を表します。