stateは日本語で「状態」という意味になる.Stateパターンは,オブジェクトの内部状態が変化した時に,オブジェクトの振る舞いも変化させるパターンである.
Stateパターンの主な要素は以下である.
java// State
interface State {
void handle(Context context);
}
// Concrete State
class ConcreteStateA implements State {
@Override
public void handle(Context context) {
System.out.println("ConcreteStateA handle");
context.setState(new ConcreteStateB());
}
}
class ConcreteStateB implements State {
@Override
public void handle(Context context) {
System.out.println("ConcreteStateB handle");
context.setState(new ConcreteStateA());
}
}
// Context
class Context {
private State state;
public Context() {
state = new ConcreteStateA();
}
public void setState(State state) {
this.state = state;
}
public void request() {
state.handle(this);
}
}
// Client
public class StatePattern {
public static void main(String[] args) {
Context context = new Context();
context.request();
context.request();
context.request();
}
}
これまで使ったことはないが,色々なケースで使えそう.身近な例としてはエアコンがある.暖房と冷房とで状態が変化し,それに応じた振る舞いの変化を実現できるできる.
クライアント側からは,各状態について関心を持つ必要はなく,また,状態オブジェクトもインターフェースに沿って実装していればよい.if分による条件分岐の必要が無くなる.