デザインパターンを覚えたい (State)
Stateパターン
各状態に対して固有のクラスとして表現するパターン。特徴は
- 状態変化を単純なインスタンスの差し替えで表現できる
- 新しい状態の追加が用意
といったところ。クラス図だけ見るとStrategyパターンと同じだけど、違いは何だろ。
Strategyパターンは手順/動作に主眼を置くのに対して。Stateは状態に主眼を置いてる点?
実装。よくあるフラグ変化を手軽に実装してみる。
http://dl.dropbox.com/u/7810000/code/design_pattern/state.zip
実行。
$ ant test
Buildfile: /Users/xxx/tmp/state/build.xmlbuild:
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(); } } }