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に保持するクラスのインスタンスを保持し、
その状態に応じて実行する処理を、クラスの実装で処理を変更させています。