Stateパターンの解説

Stateパターンとは、オブジェクトの内部状態によって振る舞いを変えるデザインパターンだ。これにより、オブジェクトの状態が変わるたびに、動作が異なるように実装できる。

たとえば、キャラクターが「普通」「疲れている」「元気」のような状態によって異なる行動を取る場合に使える。

では、サンプルコードを一緒に見ていこう。

解説

例えば、君がライト(電灯)を使うとき、スイッチの「オン」と「オフ」でライトの動きが変わるよね。この「オン」と「オフ」の状態を管理するのがStateパターンの役割だ。

Step 1: ライトの基本クラスを作る

まず、ライト(電灯)を表現するクラスを作る。このライトは、スイッチが「オン」か「オフ」の状態で振る舞いを変えるよ。


// ライトのクラス
class Light {
  constructor() {
    this.state = new OffState(); // 最初はオフの状態
  }

  // 状態を切り替えるメソッド
  changeState(state) {
    this.state = state;
  }

  pressButton() {
    this.state.pressButton(this);
  }
}
      

Step 2: 「オン」と「オフ」の状態を表現するクラスを作る

次に、ライトの「オン」と「オフ」の状態をそれぞれ別のクラスで表現しよう。これにより、ライトの状態ごとに異なる振る舞いを定義することができる。


// オフの状態
class OffState {
  pressButton(light) {
    console.log("ライトがオンになりました");
    light.changeState(new OnState());
  }
}

// オンの状態
class OnState {
  pressButton(light) {
    console.log("ライトがオフになりました");
    light.changeState(new OffState());
  }
}
      

Step 3: ライトを使ってスイッチを押す操作を実行する

最後に、ライトのインスタンスを作り、スイッチを押して「オン」と「オフ」を繰り返してみよう。Stateパターンにより、ライトの状態が自動的に切り替わるよ。


// ライトのインスタンスを作成
const light = new Light();

// スイッチを押して状態を切り替える
light.pressButton(); // 結果: ライトがオンになりました
light.pressButton(); // 結果: ライトがオフになりました
      

Stateパターンの重要なポイント

これでStateパターンの解説は終わりだ。
このパターンを使うと、オブジェクトの状態に応じて動作を変更できるため、状態に依存した処理が簡単に実装できる。