Java | switch文を戦略パターンにリファクタリングする練習問題」

Java Java
スポンサーリンク

では「練習問題2:支払い方法の処理」を switch文 → 戦略パターン にリファクタリングしてみましょう。


元のコード(switch文)

switch (paymentMethod) {
    case "CREDIT":
        System.out.println("クレジットカードで支払い");
        break;
    case "CASH":
        System.out.println("現金で支払い");
        break;
    case "BANK":
        System.out.println("銀行振込で支払い");
        break;
    default:
        throw new UnsupportedOperationException("未対応の支払い方法: " + paymentMethod);
}
Java

戦略パターンでのリファクタ解答

1. 戦略インターフェース

interface PaymentStrategy {
    void pay();
}
Java

2. 具体的な戦略クラス

class CreditPayment implements PaymentStrategy {
    public void pay() {
        System.out.println("クレジットカードで支払い");
    }
}

class CashPayment implements PaymentStrategy {
    public void pay() {
        System.out.println("現金で支払い");
    }
}

class BankPayment implements PaymentStrategy {
    public void pay() {
        System.out.println("銀行振込で支払い");
    }
}
Java

3. コンテキスト(戦略選択)

import java.util.HashMap;
import java.util.Map;

class PaymentContext {
    private static final Map<String, PaymentStrategy> strategies = new HashMap<>();

    static {
        strategies.put("CREDIT", new CreditPayment());
        strategies.put("CASH", new CashPayment());
        strategies.put("BANK", new BankPayment());
    }

    public static void execute(String method) {
        PaymentStrategy strategy = strategies.get(method);
        if (strategy != null) {
            strategy.pay();
        } else {
            throw new UnsupportedOperationException("未対応の支払い方法: " + method);
        }
    }
}
Java

4. 利用側

public class Main {
    public static void main(String[] args) {
        PaymentContext.execute("CREDIT"); // クレジットカードで支払い
        PaymentContext.execute("CASH");   // 現金で支払い
    }
}
Java

解説

  • switch文の問題点
    • 支払い方法が増えるとcaseがどんどん増える。
    • 責務が集中してテストしづらい。
  • 戦略パターンのメリット
    • 支払い方法ごとにクラスを分けるので責務が明確。
    • 新しい支払い方法(例:PayPay、ApplePay)を追加する場合はクラスとMap登録だけで済む。
    • 単体テストが容易(例:CreditPaymentだけテスト可能)。
Java
スポンサーリンク
シェアする
@lifehackerをフォローする
スポンサーリンク
タイトルとURLをコピーしました