【デザインパターン】【GoF】【Java】ステート(State)パターン

Stateパターン

 * 実装処理に関するパターン
 * 以下のようなif / Switch文など条件によって、処理を変える場合に適用する
 * Strategyパターンとほぼ同一だが、目的が異なる。Stateパターンは、その時の状態にとって処理を変える

登場人物

State(状態)

 * 状態を表すクラス
 * 状態毎に振舞いが異なるメソッドのインタフェースを定義

ConcreteState (具体的な状態)

 * 「State」を継承
 * 具体的な状態を、「1クラス」 = 「1状態」 で定義

Context(状況判断)

 * 現在の状態 「ConcreteStata」を保持する
 * 利用者へのインタフェースを定義
 * 状態を変更するメソッドを定義

Client (利用者)

 * 利用者

メリット

 * 状態が増えた場合に、利用者側を変更しなくても可能

サンプル

IState.java

* State(状態)
public interface IState {
   public void execute();
}

ErrorState.java

* ConcreteState (具体的な状態) その1
public class ErrorState implements IState {
   @Override
   public void execute() {
      System.out.println("エラー");
   }
}

WarningState.java

* ConcreteState (具体的な状態) その2
public class WarningState implements IState {
   @Override
   public void execute() {
      System.out.println("警告");
   }
}

NormalState.java

* ConcreteState (具体的な状態) その3
public class NormalState implements IState {
   @Override
   public void execute() {
      System.out.println("正常");
   }
}

Context.java

* Context(状況判断)
public class Context {
    private IState state = null;

    public void setState(IState state) {
        this.state = state;
    }
    public IState getState() {
        return this.state;
    }   
    public void request() {
       this.state.execute();
    }
}

Main.java

* Client (利用者)
public class Main {
   public static void main(String[] args) {
      Context context =new Context();
      
      IState state = new NormalState();
      context.setState(state);
      context.request();
      
      state = new WarningState();
      context.setState(state);
      context.request();
      
      state = new ErrorState();
      context.setState(state);
      context.request();
   }
}

イメージしやすい例

熱帯魚のヒーター制御

http://d.hatena.ne.jp/dreammind/20110501/1304214997

マリオ(デカマリオ、チビマリオ、ファイアーマリオ

http://d.hatena.ne.jp/hkhumanoid/20090528/1243473358

Normal Warning Error

http://blog.jnito.com/entry/20100717/1279321664

予約システム(貸し出し中、取り置き依頼あり/なし、返却済み、など)

http://internetcom.jp/developer/20081224/26.html

その他

 他にも、以下のものがある

 * ログイン
 * TCP Connection
など


関連記事

デザインパターンの分類 ~目次~

http://blogs.yahoo.co.jp/dk521123/32973303.html

C#】ストラテージ(Strategy)パターン

http://blogs.yahoo.co.jp/dk521123/24787700.html