処理前の内部状態(Memento)を保持し、状態を復元する仕組みです。
package com.example.memento;
public class Memento {
int protectedInfo;
Memento(int protectedInfo) {
this.protectedInfo = protectedInfo;
}
int getProtectedInfo() {
return protectedInfo;
}
public int getPublicInfo() {
return protectedInfo;
}
}
package com.example.memento;
public class Originator {
private int info;
public Originator(int info) {
this.info = info;
}
public Memento createMemento() {
Memento memento = new Memento(info);
return memento;
}
public void restoreMemento(Memento memento) {
this.info = memento.protectedInfo;
}
public void process() {
info++;
}
public String toString() {
return Integer.toString(info);
}
}
package com.example.main;
import com.example.memento.Memento;
import com.example.memento.Originator;
public class Caretaker {
public static void main(String[] args) {
int info = 1;
Originator originator = new Originator(info);
Memento memento = originator.createMemento();
originator.process(); // 更新
originator.toString(); // 出力
originator.restoreMemento(memento); // レストア
originator.toString(); // 出力
}
}
MementoとOriginator は同じパッケージに含まれますが、Caretaker は別のパッケージで構成されます。
Caretaker はMementoを保持し、好きなタイミングで復元することができますが、Caretaker は直接Mementoのデータを書き換えることはできません。
なので、データの一貫性を保持しつつ、データを復元することができるようになります。