メインコンテンツまでスキップ

🔍 State と Strategy の比較

✅ 比較の目的

State パターンと Strategy パターンは、いずれも「ある動作を切り替える仕組み」を提供するが、目的と適用タイミングには明確な違いがある。本節では、両者の設計意図や使い分けの観点を整理し、適切な場面での選定に役立つ判断材料を提示する。

✅ 比較の観点

比較項目State(状態)Strategy(戦略)
主な目的状態に応じて振る舞いを切り替える戦略(アルゴリズム)を柔軟に差し替える
実装の形状態ごとのクラスに処理を委譲戦略ごとのクラスに処理を委譲
トリガーオブジェクト内部の状態変化外部からの注入や構成で切り替え
切り替え方法クラス内部で状態遷移を行う呼び出し元が戦略を変更する
状態保持現在の状態を保持し遷移する状態を保持しない(単なるアルゴリズム)

✅ 類似点

  • いずれも「振る舞いの切り替え」を目的としている。
  • 実行する処理を、インターフェースを通じて外部のクラスに委譲する。
  • 条件分岐を排除し、拡張性と保守性を向上させる設計手法。

✅ 決定的な違い

観点State パターンStrategy パターン
主体オブジェクトの内部状態実行時に注入される戦略(外部制御)
動的切り替えオブジェクト自身が遷移ロジックを持つ呼び出し元が差し替える
状態遷移の概念明確に状態を持ち、遷移がある明示的な遷移はなく、都度指定
クライアントの役割状態管理を意識しない戦略を選定・注入する責務がある

✅ 選び分けの判断軸

  • ✅ 内部状態の変化に応じた処理変更をしたい → State
  • ✅ 外部構成やユーザー操作によって処理を差し替えたい → Strategy
  • ✅ 処理の流れをオブジェクトに委ねたい → State
  • ✅ 呼び出し元が戦略を選びたい → Strategy

✅ UML クラス図

State パターン

Strategy パターン

✅ 実務でのヒント

  • State は状態遷移を伴う業務ロジックに適している(例:ログイン状態・注文ステータスなど)
  • Strategy は条件分岐の回避や、動的な構成切り替えに適している(例:認証戦略、通知戦略など)
  • ▶️ 両者が混同されやすいが、「変化の主体」と「切り替えのトリガー」が違う点を意識することが重要。

✅ まとめ

  • State は、内部状態の遷移によって振る舞いを変えるための構造。
  • Strategy は、振る舞いを外部から差し替えるための構造。
  • 一見似ていても、「制御の主導権」と「状態の持ち方」が異なるため、使い分けが必要である。