✨
デザインパターンを学ぶ #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