Strategyパターン - TypeScriptでの交換可能なアルゴリズム

交換可能なアルゴリズムを定義するStrategyパターンをマスターしましょう。ソート、バリデーション、価格設定、認証戦略のTypeScript実装例。

Behavioral

詳細な説明

Strategyパターン

Strategyパターンは、アルゴリズムのファミリーを定義し、それぞれをカプセル化して交換可能にします。アルゴリズムは、それを使用するクライアントから独立して変化できます。

Strategyなしの場合

Strategyなしのコードは、大きなswitch文やif-elseチェーンを含むことが多いです。新しいアルゴリズムを追加するたびに既存のコードを変更する必要があり、開放閉鎖の原則に違反します。

Strategyによる改善

各アルゴリズムが独自のクラスになります。コンテキストは戦略オブジェクトへの参照を保持し、アルゴリズムを委譲します。新しい戦略を追加しても既存のコードは変更不要です。

Strategy vs State

両方のパターンは合成と委譲を使用します。重要な違い: Strategyはクライアントがアルゴリズムを選択します。Stateは内部条件に基づいて自動的に遷移します。Strategyオブジェクトは通常ステートレスで交換可能です。Stateオブジェクトは現在の状態についてのコンテキストを持ちます。

関数型の代替

ファーストクラス関数を持つ言語(TypeScript、JavaScript、Python)では、Strategyパターンは関数を渡すことで簡略化できます:

type PricingFn = (base: number) => number;
const premium: PricingFn = (base) => base * 0.9;
const standard: PricingFn = (base) => base;

この関数型アプローチはシンプルな戦略には適していますが、状態を持つ能力や複数のメソッドを実装する能力を失います。

ユースケース

Strategyは、決済処理(Stripe、PayPal、銀行振込の切り替え)、ファイル圧縮(gzip、brotli、zstd)、認証方式(OAuth、JWT、APIキー)、可視化ツールでのソートアルゴリズム、実行時にアルゴリズムを選択すべきあらゆるシナリオに最適です。

試してみる — Design Pattern Reference

フルツールを開く