Dyuichi Blog

オブジェクト指向シリーズⅣ: デザインパターン [⑲ State]

概要

stateは日本語で「状態」という意味になる.Stateパターンは,オブジェクトの内部状態が変化した時に,オブジェクトの振る舞いも変化させるパターンである.

Stateパターンの主な要素は以下である.

  • State:オブジェクトの各状態に共通のインターフェース
  • ConcreteState:Stateインターフェースを実装したクラス
  • Context:Stateを変更するメソッドを提供するクラス

クラス図

画像が読み込まれない場合はページを更新してみてください。

実装例(Java)

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分による条件分岐の必要が無くなる.