デザインパターンを学ぶ #3 Strategy(ストラテジー)

に公開

1. はじめに

デザインパターン学習シリーズの第3回。今回は「Strategy(ストラテジー)」パターンを取り上げます。
目的は「処理アルゴリズムを差し替え可能にして、条件分岐をすっきりさせる方法」を理解することです。

2. Strategy とは?

Strategy パターンは「処理のアルゴリズムをインターフェースで定義し、実行時に切り替える」仕組みです。
利用側は具体的な処理を意識せず、同じインターフェースを通して利用できます。

例えば「支払い方法」をクレジットカード、PayPal、銀行振込で切り替える場合、
Strategy パターンを使うと if 文や switch 文を使わずに実装できます。

3. 実装例(PHP)

interface PaymentStrategy {
    public function pay(int $amount): void;
}

class CreditCardPayment implements PaymentStrategy {
    public function pay(int $amount): void {
        echo "Paid {$amount} by Credit Card\n";
    }
}

class PaypalPayment implements PaymentStrategy {
    public function pay(int $amount): void {
        echo "Paid {$amount} by PayPal\n";
    }
}

class Checkout {
    private PaymentStrategy $strategy;

    public function __construct(PaymentStrategy $strategy) {
        $this->strategy = $strategy;
    }

    public function process(int $amount): void {
        $this->strategy->pay($amount);
    }
}

// 利用例
$checkout = new Checkout(new PaypalPayment());
$checkout->process(5000); // Paid 5000 by PayPal

4. メリットと注意点

メリット

  • アルゴリズムの切り替えが容易
  • if/switch の分岐を減らせる
  • 新しい処理を追加しても既存コードを壊さない

注意点

  • クラス数が増えやすい
  • シンプルな処理に使うと逆に複雑化する

5. 実務での利用例

  • 支払い方法の切り替え(クレジットカード / PayPal / 銀行振込)
  • 認証方法の切り替え(OAuth / Basic 認証 / JWT)
  • 検索アルゴリズムやバリデーションロジックの切り替え

6. まとめ

Strategy パターンは「処理アルゴリズムをインターフェースに抽象化し、実行時に切り替えられる」仕組みです。
分岐をなくして拡張性を高めたいときに役立ちます。
次回は Observer(オブザーバー)など、イベント通知系のパターンを扱うと流れが自然です。

Discussion