では「練習問題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();
}
Java2. 具体的な戦略クラス
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("銀行振込で支払い");
}
}
Java3. コンテキスト(戦略選択)
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);
}
}
}
Java4. 利用側
public class Main {
public static void main(String[] args) {
PaymentContext.execute("CREDIT"); // クレジットカードで支払い
PaymentContext.execute("CASH"); // 現金で支払い
}
}
Java解説
- switch文の問題点
- 支払い方法が増えるとcaseがどんどん増える。
- 責務が集中してテストしづらい。
- 戦略パターンのメリット
- 支払い方法ごとにクラスを分けるので責務が明確。
- 新しい支払い方法(例:PayPay、ApplePay)を追加する場合はクラスとMap登録だけで済む。
- 単体テストが容易(例:
CreditPaymentだけテスト可能)。


