mementoのwikiのサンプルコードより、良いコードをかける気がしたので 書いてみる
それぞれの状態のインスタンスを保持するため、ディープクローンする。
wikiのサンプルだとString型を使っていた、String型は、Javaでは特殊な扱いになっており、ディープクローンを意識しなくても、そういう使い方ができる風な仕様だ。
しかし、ふつう他のパラメータも保持する必要もでてくるだろうから、実際に使うにはディープクローンメソッドを実装する必要が出てくるだろう。
mementoとは、記念の品,形見; 思い出の種の意味だそうだ。
参考元のWikiコードのクラス名は、意図的に変更している。
Originatorとか、いろいろ、単語が使われているが、自分はいろいろな名前を増やさない主義だからだ。
できれば、mementoという単語もStateという単語に修正したい。
あと、クラスは1つにまとめることができると判断したので、一つにまとめている。
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); } }
CurrentState: Setting state to CurrentState: Setting state to State1 CurrentState: Setting state to State2 Originator: Saving to Memento. State: Setting state to State2 CurrentState: Setting state to State3 Originator: Saving to Memento. State: Setting state to State3 CurrentState: Setting state to State4 CurrentState: Setting state to State3 Originator: State after restoring from Memento: State3