Memento は、 振る舞いに関するデザインパターンの一つで、 オブジェクトの状態のスナップショットを作成し、 それを将来復元します。
Memento は、 その対象オブジェクトの内部構造やスナップショットの内部に保存されるデータの機密を守ります。
複雑度:
人気度:
使用例: Memento の原則は、 シリアライゼーション (直列化) を使って達成することが可能で、 Java ではよく見かけます。 これは、 オブジェクトの状態のスナップショットを作る上で唯一の方法でも、 最も効率のいい方法でもありませんが、 オリジネーターの構造を他のオブジェクトから隠蔽しつつ状態のバックアップを取ることはできます。
Java のコア・ライブラリーでのこのパターンの使用例です:
図形エディターと複雑な取り消し・再実行操作
このグラフィカル・エディターは、 画面上で図形の色と位置を変更できます。 どのような変更も取り消したり繰り返したりできます。
「取り消し」 操作は、 Memento と Command パターンの協力で行われます。 エディターは、 実行されたコマンドの履歴を追跡します。 いかなるコマンドも、 その実行前にバックアップを作り、 それをコマンド・オブジェクトに接続します。 実行後に、 実行済みコマンドを履歴にプッシュします。
ユーザーが取り消しをリクエストした時、 エディターは履歴から最近のコマンドを取得し、 そのコマンドの内部に保存しておいたバックアップから状態を復元します。 ユーザーが別の取り消しをリクエストした場合、 エディターは履歴などから次のコマンドを取得します。
取り消されたコマンドは、 ユーザーが画面上で何らかの図形の変更を行うまで、 履歴に保持されます。 これは、 取り消されたコマンドの再実行を行う上で重要なことです。
editor
editor/Editor.java: エディター・コード
editor/Canvas.java: キャンバス・コード
history
history/History.java: 履歴にはコマンドとメメントが保存される
history/Memento.java: メメント・クラス
commands
commands/Command.java: 基底コマンド・クラス
commands/ColorCommand.java: 選択した図形の色を変更する
commands/MoveCommand.java: 選択した図形を移動する
shapes: さまざまな図形
shapes/Shape.java
shapes/BaseShape.java
shapes/Circle.java
shapes/Dot.java
shapes/Rectangle.java
shapes/CompoundShape.java
Demo.java: 初期化コード
OutputDemo.png: スクリーン・ショット