*趣旨 [#p969eac5]
mementoのwikiのサンプルコードより、良いコードをかける気がしたので
書いてみる


*コード [#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);
     }
 }


トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS