*目次 [#ab4e0654] #contents *趣旨 [#p969eac5] mementoのwikiのサンプルコードより、良いコードをかける気がしたので 書いてみる **肝となる考え方 [#n9bdeafd] それぞれの状態のインスタンスを保持するため、ディープクローンする。 wikiのサンプルだとString型を使っていた、String型は、Javaでは特殊な扱いになっており、ディープクローンを意識しなくても、そういう使い方ができる風な仕様だ。 しかし、ふつう他のパラメータも保持する必要もでてくるだろうから、実際に使うにはディープクローンメソッドを実装する必要が出てくるだろう。 **作成したコードについて [#c2ccef27] mementoとは、記念の品,形見; 思い出の種の意味だそうだ。 参考元のWikiコードのクラス名は、意図的に変更している。 Originatorとか、いろいろ、単語が使われているが、自分はいろいろな名前を増やさない主義だからだ。 できれば、mementoという単語もStateという単語に修正したい。 あと、クラスは1つにまとめることができると判断したので、一つにまとめている。 *コード [#d852beea] **Mementoクラス [#o911c8fe] 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()); } } } **MementoExampleクラス [#g7ac8be0] 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); } } **実行結果 [#va5dc36f] 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