共通点
- どちらも 「振る舞いを切り替える」 デザインパターン
- Context が「あるクラス(戦略/状態)」に処理を委譲する仕組み
- if/else の乱立を避け、切り替えを柔軟にする
違い
| 項目 | Strategy パターン | State パターン |
|---|---|---|
| 目的 | アルゴリズムを差し替え可能にする | オブジェクトの「状態」に応じて振る舞いを変える |
| 切替のトリガー | クライアントや外部からの選択(手動で setStrategy) | オブジェクトの内部状態の変化(自動で状態が変わる) |
| Context の役割 | Strategy を保持し、呼び出し側が選んだ戦略を実行 | State を保持し、状態ごとの処理を委譲 |
| 意図する設計 | 「処理方法を選択」 | 「状態に応じた動作」 |
| 例え | 支払い方法を「クレカ or PayPal」に切り替え | ドアが「開いている/閉じている」で動作が変わる |
図解イメージ
Strategy パターン vs State パターン(比喩で理解)
例え 1:ショッピングと支払い方法
-
Strategy:
→ あなたがレジで「クレジットカード」「PayPal」「現金」から支払い方法を選ぶ。
→ 外部(ユーザー)が選択するのが特徴。 -
State:
→ レジが「支払い済み」になったら自動でレシートが出る。
→ 状態が「未払い → 支払い済み」に変わった瞬間に振る舞いが切り替わる。
例え 2:交通信号
-
Strategy:
→ あなたが「今日は歩く」「自転車に乗る」「電車で行く」を自分で選ぶ。 -
State:
→ 信号機が「赤 → 青 → 黄」と自動で変わり、それに応じて歩行者や車の動作が変わる。
→ 状態が進行するにつれて自動的に振る舞いが変わる。
Flutter / Android の実務例
-
Strategy
- 入力フォームのバリデーションルール(メール / 電話番号 / ユーザー名)
- 決済手段の切替(クレカ / PayPal / ポイント)
-
State
- ログイン状態(未ログイン / ログイン済 / セッション切れ)で画面を変える
- 音楽プレーヤーの状態(再生中 / 一時停止 / 停止)
まとめ
- Strategy = 外部からアルゴリズムを 選んで差し替える
- State = 内部状態が変化すると 自動で振る舞いが切り替わる
- 似ているが、切替の主体(外部か内部か) が違うのがポイント