Stateパターンとは、オブジェクトの内部状態によって振る舞いを変えるデザインパターンだ。これにより、オブジェクトの状態が変わるたびに、動作が異なるように実装できる。
たとえば、キャラクターが「普通」「疲れている」「元気」のような状態によって異なる行動を取る場合に使える。
では、サンプルコードを一緒に見ていこう。
例えば、君がライト(電灯)を使うとき、スイッチの「オン」と「オフ」でライトの動きが変わるよね。この「オン」と「オフ」の状態を管理するのがStateパターンの役割だ。
まず、ライト(電灯)を表現するクラスを作る。このライトは、スイッチが「オン」か「オフ」の状態で振る舞いを変えるよ。
// ライトのクラス
class Light {
constructor() {
this.state = new OffState(); // 最初はオフの状態
}
// 状態を切り替えるメソッド
changeState(state) {
this.state = state;
}
pressButton() {
this.state.pressButton(this);
}
}
次に、ライトの「オン」と「オフ」の状態をそれぞれ別のクラスで表現しよう。これにより、ライトの状態ごとに異なる振る舞いを定義することができる。
// オフの状態
class OffState {
pressButton(light) {
console.log("ライトがオンになりました");
light.changeState(new OnState());
}
}
// オンの状態
class OnState {
pressButton(light) {
console.log("ライトがオフになりました");
light.changeState(new OffState());
}
}
最後に、ライトのインスタンスを作り、スイッチを押して「オン」と「オフ」を繰り返してみよう。Stateパターンにより、ライトの状態が自動的に切り替わるよ。
// ライトのインスタンスを作成
const light = new Light();
// スイッチを押して状態を切り替える
light.pressButton(); // 結果: ライトがオンになりました
light.pressButton(); // 結果: ライトがオフになりました
これでStateパターンの解説は終わりだ。
このパターンを使うと、オブジェクトの状態に応じて動作を変更できるため、状態に依存した処理が簡単に実装できる。