mementoのwikiのサンプルコードより、良いコードをかける気がしたので 書いてみる
package com.memento; import java.util.ArrayList; /** * Mementoパターン */ public class Memento <T> { T state; /** * コンストラクター * @param stateToSave */ public Memento(T state) { set(state); } /** * 値を設定 * @return */ public void set(T state) { System.out.println(getClass().getSimpleName() + ": Setting state to " + state); this.state = state; } /** * 値を取得 * @return */ public T get() { return state; } public StateList<T> stateList = new StateList<T>(); /** * 新しい状態インスタンスを生成 * @return */ public Memento<T> clone() { return new Memento<T>(state); } public void save() { System.out.println("Originator: Saving to Memento."); stateList.save(this); } public void restore(int index) { set(stateList.get(index).get()); System.out.println("Originator: State after restoring from Memento: "+state); } /** * ステータス履歴リスト * * @param <T> */ @SuppressWarnings({ "serial", "hiding" }) public class StateList<T> extends ArrayList<Memento<T>>{ public void save(Memento<T> state){ add(state.clone()); } } }
package test; import com.memento.Memento; /** * サンプル */ public class MementoExample { public static void main(String[] args) { Memento<String> memento = new Memento<String>(""); memento.set("State1"); memento.set("State2"); memento.save(); memento.set("State3"); memento.save(); memento.set("State4"); memento.restore(1); } }