State

パターンの目的

オブジェクトの内部状態が変化した時に、オブジェクトが振舞いを変えるようにする。クラス内では、振舞いの変化を記述せず、状態を表すオブジェクトを導入することでこれを実現する。

GoF パターンのクラス図

structure-08-05:state

MixJuice 版 State (改善)

解決される GoF パターンの問題点

拡張性の問題点
クラス State で、十分なオペレーションをあらかじめ定義しておく必要がある。例えば GoF 本の動機の章の例でいえば、 Open, Close, Acknowledge というオペレーションに加えて、あとから Flush というオペレーションが必要になることは容易に想像できる。(この問題点は GoF 本では指摘されていない。頻繁に起こり得る問題ではないだろうか?)

対策

抽象クラス State へのアブストラクトメソッド追加により、あとからオペレーションを追加できる。

結果

あらかじめ予想されていなかったオペレーションを追加することが可能になる。すべての ConcreteState クラスに、追加されたオペレーションを実装する補完モジュールが必要になる。

構造

structure-08-07:state

module original {
  define class Context {
    State state;
    define void request(){
      state.handle();
    }
  }
  define abstract class State {
    define abstract void handle();
  }
  define class ConcreteStateA extends State {
    void handle(){...}
  }
  define class ConcreteStateB extends State {
    void handle(){...}
  }
}
module extension extends original {
  class State {
    define abstract void newOperation();
  }
  class ConcreteStateA {
    void newOperation(){...}
  }
  class ConcreteStateB {
    void newOperation(){...}
  }
}

MixJuice によるデザインパターン改善カタログ


田中 哲 <akr@m17n.org>, 一杉 裕志 <y-ichisugi@aist.go.jp>