使いどころ
* Undo機能 => 一度変化してしまったインスタンスを、 「少し前の状態に戻したい」「ある時点の状態に戻したい」などの時に使用する ※ ただし、完全に複製するのではなく、必要な情報のみを保持しておき、 必要なデータのみを復元する
サンプル
Memento.java
* 「Originator」の内部情報(フィールド値)を保持するクラス// 「Originator」の内部情報(フィールド値)を保持するクラス
public class Memento {
int param1;
String param2;
Memento(int param1, String param2) {
this.param1 = param1;
this.param2 = param2;
}
public int getParam1() {
return this.param1;
}
public String getParam2() {
return this.param2;
}
}
Originator.java
* 自身の状態を「Memento」として保持し、与えられた「Memento」から自身の状態を復元するクラス// 自身の状態を「Memento」として保持する
// 与えられた「Memento」から自身の状態を復元するクラス
public class Originator {
private int param1;
private String param2;
public Originator() {
this.param1 = 0;
this.param2 = "";
}
public void countParam1(int param1) {
this.param1 = this.param1 + param1;
}
public void appendParam2(String param2) {
this.param2 = this.param2 + param2;
}
public int getParam1() {
return this.param1;
}
public String getParam2() {
return this.param2;
}
/// 自分の状態を保存した「Memento」を作成するメソッド
public Memento createMemento() {
return new Memento(this.param1, this.param2);
}
// 要求された「Memento」に状態を戻すメソッド
public void restoreMemento(Memento memento) {
this.param1 = memento.param1;
this.param2 = memento.param2;
}
}
Caretaker.java
* 「Originator」の状態を保存したい場合、「Memento」を保持する* 「Originator」の状態を元に戻したい場合、「Memento」を受け渡す
public class Caretaker {
Memento memento;
public Memento getMemento() {
return this.memento;
}
public void setMemento(Memento memento) {
this.memento = memento;
}
Client.java
* 利用者(メイン)
public class Client {
public static void main(String[] args) {
// オブジェクトを生成する
Originator original = new Originator();
// オブジェクトの状態を設定する
original.countParam1(1);
original.appendParam2("aaa");
System.out.println("Original value : " + original.getParam1() + ", " + original.getParam2() + ".");
// Mementoを取る(今の状態を記憶する)
Memento snapshot = original.createMemento();
// CaretakerでMementoオブジェクトを保持する
Caretaker caretaker = new Caretaker();
caretaker.setMemento(snapshot);
// その他操作
original.countParam1(3);
original.countParam1(4);
original.appendParam2("bbb");
original.appendParam2("ccc");
System.out.println("Updated value : " + original.getParam1() + ", " + original.getParam2() + ".");
// Mementoによって復元する
original.restoreMemento(caretaker.getMemento());
System.out.println("Restored value : " + original.getParam1() + ", " + original.getParam2() + ".");
}
}
出力結果
Original value : 1, aaa. Updated value : 8, aaabbbccc. Restored value : 1, aaa.
参考文献
全般
http://itpro.nikkeibp.co.jp/article/COLUMN/20060113/227238/Java
http://www.techscore.com/tech/DesignPattern/Memento.html/http://www.itsenka.com/contents/development/designpattern/memento.html
http://www.syboos.jp/sysdesign/doc/20080619131701846.html
http://waman.hatenablog.com/entry/20090917/1253135213
http://www.ie.u-ryukyu.ac.jp/~e085739/java.it.19.html
http://d.hatena.ne.jp/hiro_sa/20130330/1364663553
C#
http://www.rarestyle.net/main/patterns/memento.aspxhttp://msyi303.blog130.fc2.com/blog-entry-48.html