1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【デザインパターン】Strategy パターン vs State パターン

1
Posted at

共通点

  • どちらも 「振る舞いを切り替える」 デザインパターン
  • 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 = 内部状態が変化すると 自動で振る舞いが切り替わる
  • 似ているが、切替の主体(外部か内部か) が違うのがポイント
1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?