mementoは日本語で「記念品」,「形見」という意味になる.Mementoパターンは,ある時のオブジェクトの状態を保存しておき,必要に応じて復元するパターンである.
Mementoパターンの主な要素は以下である.
javaimport java.util.ArrayList;
import java.util.List;
// Memento
class Memento {
private String state;
public Memento(String state) {
this.state = state;
}
public String getState() {
return state;
}
}
// Originator
class Originator {
private String state;
public void setState(String state) {
this.state = state;
}
public String getState() {
return state;
}
public Memento saveStateToMemento() {
return new Memento(state);
}
public void getStateFromMemento(Memento memento) {
state = memento.getState();
}
}
// CareTaker
class CareTaker {
private List<Memento> mementoList = new ArrayList<>();
public void add(Memento memento) {
mementoList.add(memento);
}
public Memento get(int index) {
return mementoList.get(index);
}
}
// Client
public class MementoPattern {
public static void main(String[] args) {
Originator originator = new Originator();
CareTaker careTaker = new CareTaker();
originator.setState("State #1");
originator.setState("State #2");
careTaker.add(originator.saveStateToMemento());
originator.setState("State #3");
careTaker.add(originator.saveStateToMemento());
originator.setState("State #4");
System.out.println("Current State: " + originator.getState());
originator.getStateFromMemento(careTaker.get(0));
System.out.println("First saved State: " + originator.getState());
originator.getStateFromMemento(careTaker.get(1));
System.out.println("Second saved State: " + originator.getState());
}
}
インスタンスの状態がプログラム実行中にどんどん変化するケースがあれば,Mementoパターンを使って前の状態に戻すことは有効である.
しかし,インスタンスの状態がプログラム実行中にどんどん変化するケースはどのようなケースだろうか?具体的なケースは思いつけないが,プロパティが変わっていくケースは十分あり得る気がする.