【ステートパターン】

Stateパターン とは?

公開:
💡 状態ごとにキャラが変わる「変身ヒーロー」パターン
📌 このページのポイント
Stateパターン:状態ごとに振る舞いが変わる Context currentState StateA:待機中 handle() → 受付開始 次 → StateB StateB:処理中 handle() → 処理実行 次 → StateC StateC:完了 handle() → 結果返却 次 → StateA Contextは状態クラスへの参照を切り替えるだけ。if文不要。 例:自動販売機・信号機・注文管理システム
Stateパターン:状態をクラスで表現し、状態遷移を明示的に管理する
ひよこ ひよこ
Stateパターンって、状態を管理するパターンなの?
ペンギン先生 ペンギン先生
そうだよ!オブジェクトの「状態」をクラスとして表現して、状態によって振る舞いを切り替えるパターンだよ。例えば自動販売機で「待機中」「お金投入済み」「売り切れ」で動きが違うよね。
ひよこ ひよこ
普通はif文で状態を切り替えるんじゃないの?
ペンギン先生 ペンギン先生
それだと状態が増えるたびにif/switch分岐が膨れ上がってしまうんだ。Stateパターンは状態ごとにクラスを作るから、新しい状態を追加しても既存のコードをほぼ変えなくていいよ。
ひよこ ひよこ
状態クラスを切り替えるのはどうするの?
ペンギン先生 ペンギン先生
コンテキスト(文脈)オブジェクトが現在の状態クラスへの参照を持つんだ。状態遷移が起きたら、参照先を別の状態クラスに差し替えるだけだよ。呼び出し側は状態の変化を意識しなくていいんだ。
ひよこ ひよこ
StrategyパターンとStateパターン、似てない?
ペンギン先生 ペンギン先生
構造はほぼ同じなんだ!違いは「目的」と「遷移の管理」だよ。Strategyは外部からアルゴリズムを切り替えるもので、Stateはオブジェクト自身が状態に応じて振る舞いを変え、かつ次の状態への遷移も自分で管理するんだ。
ひよこ ひよこ
どんな場面でよく使われるの?
ペンギン先生 ペンギン先生
信号機・自動販売機・ゲームのキャラクターAI・注文管理システム(未確認→確認済→発送済→完了)など、明確な状態遷移がある設計に向いているよ。有限状態機械(FSM)をオブジェクト指向で実装する代表的な方法なんだ。
ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「Stateパターン」って出てきたら「状態ごとに振る舞いを変えるクラス構成のパターン」と思えればだいたいOK!
📖 おまけ:英語の意味
「State Pattern」 = ステートパターン
💬 「State(状態)」をそのままクラスにしたGoFのデザインパターンだよ。信号機・自動販売機・ゲームのキャラクター状態管理など、明確な状態遷移がある場面でよく使われるんだよ
← 用語集にもどる