【すとらてじーぱたーん】

Strategyパターン とは?

💡 アルゴリズムを「差し替え可能な部品」にする
📌 このページのポイント
Strategy パターン(アルゴリズムの切替) Context 例: 決済処理クラス strategy (差し替え可能) execute() 委譲 ≪interface≫ Strategy pay(amount) 共通のインターフェース クレジットカード pay(amount) PayPay pay(amount) 銀行振込 pay(amount) アルゴリズムを差し替え可能にして、柔軟な処理切替を実現
Strategyパターンのイメージ
ひよこ ひよこ

if文で切り替えるのとどう違う?

ペンギン先生 ペンギン先生

if (type === 'A') { algoA() } else if (type === 'B') { algoB() }のように書くと、新しいタイプを追加するたびにif文を修正する必要がある。Strategyパターンなら新しい戦略クラスを追加するだけ。既存コードの修正が不要(Open-Closed Principle)。戦略が5個、10個と増えるとif文は破綻するよ

ひよこ ひよこ

具体例を教えて?

ペンギン先生 ペンギン先生

EC サイトの送料計算。通常配送、速達、コンビニ受取でそれぞれ計算ロジックが違う。Strategy パターンなら NormalShipping、ExpressShipping、ConvenienceShipping を作って、注文時に差し替える。新しい配送方法(ドローン配送!)が追加されても既存コードは変更不要だよ

ひよこ ひよこ

JavaScriptでの実装は?

ペンギン先生 ペンギン先生

JSではクラスよりも関数をそのまま渡す方がシンプル。const strategies = { normal: (weight) => weight * 100, express: (weight) => weight * 200 }; const calc = (type, weight) => strategies[type](weight); のように。TypeScriptなら型で戦略のインターフェースを定義できるよ

ひよこ ひよこ

他のパターンとの関係は?

ペンギン先生 ペンギン先生

StateパターンはStrategyパターンに似ているけど、状態遷移を含む点が異なる。Factoryパターンで戦略オブジェクトを生成することも多い。Template Methodはアルゴリズムの骨組みを親クラスで定義して一部をサブクラスで実装する方式で、Strategyのコンポジション版と言える。用途に応じて選ぼうね

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「Strategyパターン」って出てきたら「アルゴリズムを交換可能にするデザインパターン」と思えればだいたいOK!
📖 おまけ:英語の意味
「Strategy Pattern」 = 戦略パターン
💬 Strategy(戦略)を状況に応じて切り替える。GoFデザインパターンの代表格だよ
← 用語集にもどる