1. Strategy パターンとは?
- 定義: アルゴリズムのファミリーを定義し、それぞれをカプセル化して交換可能にするデザインパターン
- 目的: 実行時にアルゴリズムを動的に変更可能にする
- カテゴリ: 振る舞いパターン(Behavioral Pattern)
2. どんな時に使う?
- 同じタスクを異なる方法で実行する必要がある場合
- アルゴリズムの変更をクライアントから独立させたい場合
- 条件分岐を減らし、コードを柔軟にしたい場合
3. 構造
- Context: 戦略を利用するクラス。Strategyの参照を持つ
- Strategy: アルゴリズムのインターフェース
- ConcreteStrategy: 具体的なアルゴリズムの実装
4. サンプルコード(Java)
支払い方法を切り替える例。
// Strategyインターフェース
interface PaymentStrategy {
void pay(int amount);
}
// ConcreteStrategy
class CreditCardPayment implements PaymentStrategy {
public void pay(int amount) {
System.out.println("Paid " + amount + " with Credit Card");
}
}
class PayPalPayment implements PaymentStrategy {
public void pay(int amount) {
System.out.println("Paid " + amount + " with PayPal");
}
}
// Context
class ShoppingCart {
private PaymentStrategy paymentStrategy;
public void setPaymentStrategy(PaymentStrategy strategy) {
this.paymentStrategy = strategy;
}
public void checkout(int amount) {
paymentStrategy.pay(amount);
}
}
// クライアントコード
public class Main {
public static void main(String[] args) {
ShoppingCart cart = new ShoppingCart();
cart.setPaymentStrategy(new CreditCardPayment());
cart.checkout(100); // Paid 100 with Credit Card
cart.setPaymentStrategy(new PayPalPayment());
cart.checkout(200); // Paid 200 with PayPal
}
}
5. メリット
- アルゴリズムを交換可能、コードの再利用性向上
- 条件分岐を削減し、単一責任の原則を遵守
- 新しいアルゴリズムの追加が容易
6. デメリット
- クラス数が増える
- クライアントが具体的な戦略を知る必要がある場合も
7. 実際の使用例
- ソートアルゴリズム(クイックソート、マージソートなど)の切り替え
- 支払い処理(クレジットカード、PayPal、暗号通貨など)
- ゲームのAI戦略(攻撃的、防御的など)
8. まとめ
- Strategyパターンは、アルゴリズムを動的に切り替えたい場合に有効
- 柔軟性と拡張性を提供し、条件分岐を最小限に抑える
- 適切な場面で使用すれば、コードの保守性が向上!