目次

趣旨

mementoのwikiのサンプルコードより、良いコードをかける気がしたので 書いてみる

肝となる考え方

それぞれの状態のインスタンスを保持するため、ディープクローンする。

wikiのサンプルだとString型を使っていた、String型は、Javaでは特殊な扱いになっており、ディープクローンを意識しなくても、そういう使い方ができる風な仕様だ。

しかし、ふつう他のパラメータも保持する必要もでてくるだろうから、実際に使うにはディープクローンメソッドを実装する必要が出てくるだろう。

作成したコードについて

mementoとは、記念の品,形見; 思い出の種の意味だそうだ。

参考元のWikiコードのクラス名は、意図的に変更している。

Originatorとか、いろいろ、単語が使われているが、自分はいろいろな名前を増やさない主義だからだ。

できれば、mementoという単語もStateという単語に修正したい。

あと、クラスは1つにまとめることができると判断したので、一つにまとめている。

コード

Mementoクラス

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?クラス

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
トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2014-03-03 (月) 13:06:15 (2794d)