Stateパターン

  1. 概要
     
    1. 問題
      Stateパターンは、システムの状態をクラスで表現します。多くの場合、システムの状態は フラグ と呼ばれる変数の値で表現し、メソッドでは、そのフラグ変数に値により、処理内容を切替えます。この方式では、stateの数やフラグの数が増えると、維持が困難になります。
       そこで、状態に対するクラスを考えます。

       
    2. 手法
      そこで、状態を表すstateクラス(interface)を作成し、状態の値に対応して state をimplements した「実クラス」(インスタンス)を作成します。この状態を監視し、実クラスを切替えるContextクラスを用意すれば、実クラスのメソッドを呼び出すだけで、状態に対応したメソッドを呼び出すことができます。

  2. 例1 金庫システム

    1. 金庫システム
      金庫システムは昼と夜で、対応が異なります。昼の利用は記録をとるだけですが、夜は警備員に連絡します。

    2. Stateインターフェース
      doClockとdoUseメソッドをもつstaetインターフェースを用意します。
      このインターフェースの実クラスとして、 DayStateクラスとNightStateクラスを用意します。

      public class DayState Implements State {
      public doUse(){ context.recording(); }
      public class NightState Implements State {
      public doUse(){ context.callSecuritySenter(); }

    3. Contextインターフェース
       時刻に伴う状態変化や、stateのクラスでのメソッドを定義します。この実クラスで、
       時刻による state の設定を行い、
        state.doUse
       で、処理を行います。時刻のより変化する処理を、sateの実クラスでは分岐処理なしで実現できます。

  3. 例2 図形編集システム

    1. Stateインターフェース
       選択ポインタ、矩形、円、などの選択が状態に相当します。stateインターフェースでは、マウスの押し下げ:mouseDownやドラッグ処理などのメソッドを定義します。
       Stateの実インターフェースでは、マウスの押し下げ処理に対し、図形を選択する、矩形を作成する、円を作成する、などのメソッドを作成します。

    2. Contextインターフェース
       メニューの選択などで、stateを切替えます。state.mouseDown で各状態に対応するマウスの押し下げ処理が実現できます。

  4. 関連
    1. Singleton
       stateの実クラスは唯一のクラスですから、Singletonパターンで生成すると良いでしょう。

    2. Strategy パターン
       利用するクラスを切替えて使用する発想は、Starategyパターンに類似しています。Strategyの場合、同じ処理内容に対し手法を切替えますが。