デザインパターンを覚えたい (State)

Stateパターン

各状態に対して固有のクラスとして表現するパターン。特徴は

  • 状態変化を単純なインスタンスの差し替えで表現できる
  • 新しい状態の追加が用意

といったところ。クラス図だけ見るとStrategyパターンと同じだけど、違いは何だろ。
Strategyパターンは手順/動作に主眼を置くのに対して。Stateは状態に主眼を置いてる点?

実装。よくあるフラグ変化を手軽に実装してみる。
http://dl.dropbox.com/u/7810000/code/design_pattern/state.zip

実行。

$ ant test
Buildfile: /Users/xxx/tmp/state/build.xml

build:

test:
[java] 勇者:そうだ、関所を通ろう!
[java] 守兵:ここは関所だ。許可証の持たぬ者を通すわけにはいかない。早々に立ち去れい。
[java] 勇者:許可証を手に入れないと。。。
[java] ...許可証を手に入れた!
[java] 勇者:関所に再チャレンジだ!
[java] 守兵:ここは関所だ。許可証を持っているようだな。通るがよい。
[java] 勇者:いざ新天地へ!

BUILD SUCCESSFUL
Total time: 3 seconds

ポイントはContext中でのStateの扱い方。下記のようにインスタンスを入れかえることで状態遷移していて、実際の実行部分の形は変わらない。

public class GateContext implements Context {
    private State gateState;

    public GateContext() {
        gateState = CloseGateState.getInstance();
    }

    public boolean passGate() {
        return gateState.tryToPass();
    }

    public void changeState(StateFlag flag) {
        if (flag == StateFlag.GATE_OPEN) {
            gateState = OpenGateState.getInstance();
        } else if (flag == StateFlag.GATE_CLOSE) {
            gateState = CloseGateState.getInstance();
        }
    }
}