【デザインパターン】stateパターン

stateパターンは状態を表すクラスを導入することによって、状態に応じた処理を実行させるパターンです。

通常はif文等で状態を表す変数を評価して判断しますが、これをクラスに置き換えて処理するものです。

package com.example.state;

import java.text.SimpleDateFormat;

public interface State {
	public final static SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
	
	public void setState(Context context);
	public void methodA();
	public void methodB();
}
package com.example.state;

public class ConcreteState1 implements State {
	private final static State state = new ConcreteState1();

	private ConcreteState1() {
		super();
	}
	
	public static State getInstance() {
		return state;
	}
	
	public void setState(Context context) {
		int value = context.getValue();
		if(value == 1) {
			context.changeState(ConcreteState2.getInstance());
		}
	}

	public void methodA() {
		
	}

	public void methodB() {
		
	}

}
package com.example.state;

public class ConcreteState2 implements State{
	private final static State state = new ConcreteState2();
	
	private ConcreteState2() {
		super();
	}
	
	public static State getInstance() {
		return state;
	}
	
	public void setState(Context context) {
		int value = context.getValue();
		if(value == 2) {
			context.changeState(ConcreteState1.getInstance());
		}
	}

	public void methodA() {
	}

	public void methodB() {
	}
}
package com.example.state;

public class Context {
	private int value;
	private State state = ConcreteState2.getInstance();
	
	public int getValue() {
		return value;
	}
	
	public void setValue(int value) {
		this.value = value;
		state.setState(this);
	}
	
	public void changeState(State state) {
		this.state = state;
	}
	
	public void methodA() {
		state.methodA();
	}
	
	public void methodB() {
		state.methodB();
	}
}
package com.example.state;

public class Main {
	public static void main(String args[]) {
		Context context = new Context();
		
		context.setValue(1);
		context.methodA();
		context.methodB();
		context.setValue(2);
		context.methodA();
		context.methodB();
	}

}

設定した値に応じてcontextに保持するクラスのインスタンスを保持し、

その状態に応じて実行する処理を、クラスの実装で処理を変更させています。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください