Stateパターン

Stateパターンのわかりやすい解説
http://nekogata.hatenablog.com/entry/2013/02/09/233540
http://www.techscore.com/tech/DesignPattern/State.html/

Javaで実装するとして、要点だけまとめると

1.状態インタフェースを作る。

メイン処理を行うためのメソッドを宣言する。
戻り値はインタフェース自体でもいいし、別のものでもいい。戻り値がインタフェース自体の場合、状態「遷移」を表す用途として利用できる。
ex, ノック式ペンであれば、knockとwrite

2.具体的な状態クラスを状態の数ぶん作成する。

ex, OnState, OffState

3.状態を保持するContext(状況判断)クラスを作成する。

状態クラスをインスタンス変数として保持する。
利用者がサービスを実行するためのメソッドを定義し、メソッド内では状態クラスのメソッドへ委譲する。
状態変更ができるメソッドも定義する。(サービスメソッドから呼び出される状態クラスの処理で状態遷移ができる場合や、利用者が外部から状態を設定すべきではない要件の場合は不要)
ex,
void knock() {state = state.knock();}
void write(String content) {return state.write(content);}
Context() {state = OffState;} // Constructor

4.利用者クラスはContextクラスを通して、状態を設定したり、サービスメソッドを呼び出す。

ex,

改修要件として、例えばインクがなくなった場合を考えたければ、Contextクラスにインク残量などを変数として持たせ、状態クラスのwriteの引数にしたりする。
もう一つの例として、On,Off以外にノック機能だけでなくキャップ付きのペンに改修したいとすると、CappedStateを具体的な状態クラスとして定義してあげる。※状態遷移順はCapped⇔Off⇔On

-デザインパターン