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 (具体的な状態) その1public class ErrorState implements IState { @Override public void execute() { System.out.println("エラー"); } }
WarningState.java
* ConcreteState (具体的な状態) その2public class WarningState implements IState { @Override public void execute() { System.out.println("警告"); } }
NormalState.java
* ConcreteState (具体的な状態) その3public 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/1243473358Normal Warning Error
http://blog.jnito.com/entry/20100717/1279321664予約システム(貸し出し中、取り置き依頼あり/なし、返却済み、など)
http://internetcom.jp/developer/20081224/26.htmlその他
他にも、以下のものがある * ログイン * TCP Connection など
参考文献
Java
http://blog.goo.ne.jp/xmldtp/e/ad6b4d6777c85c3aca8048515ea9b369http://www.rarestyle.net/main/patterns/state.aspx
http://www.itsenka.com/contents/development/designpattern/state.html
http://d.hatena.ne.jp/asakichy/20090318/1237355361
http://www.techscore.com/tech/DesignPattern/State.html
http://www.ie.u-ryukyu.ac.jp/~e085739/java.it.21.html
実際に採用する上で参考になると思う。他のサンプルより実運用に近い
http://www.tech-arts.co.jp/technologies/new-technologies/object-oriented/pattern/State-pattern.html