では「練習問題1:注文ステータス管理」の switch文 → 戦略パターン リファクタ解答と解説を順に示します。
元のコード(switch文)
switch (status) {
case "NEW":
System.out.println("新規注文を登録しました");
break;
case "PROCESSING":
System.out.println("注文を処理中です");
break;
case "SHIPPED":
System.out.println("注文を発送しました");
break;
case "CANCELLED":
System.out.println("注文をキャンセルしました");
break;
default:
throw new IllegalArgumentException("不明なステータス: " + status);
}
Java戦略パターンでのリファクタ解答
1. 戦略インターフェース
interface OrderStatusHandler {
void handle();
}
Java2. 具体的な戦略クラス
class NewHandler implements OrderStatusHandler {
public void handle() {
System.out.println("新規注文を登録しました");
}
}
class ProcessingHandler implements OrderStatusHandler {
public void handle() {
System.out.println("注文を処理中です");
}
}
class ShippedHandler implements OrderStatusHandler {
public void handle() {
System.out.println("注文を発送しました");
}
}
class CancelledHandler implements OrderStatusHandler {
public void handle() {
System.out.println("注文をキャンセルしました");
}
}
Java3. コンテキスト(戦略選択)
import java.util.HashMap;
import java.util.Map;
class OrderStatusContext {
private static final Map<String, OrderStatusHandler> handlers = new HashMap<>();
static {
handlers.put("NEW", new NewHandler());
handlers.put("PROCESSING", new ProcessingHandler());
handlers.put("SHIPPED", new ShippedHandler());
handlers.put("CANCELLED", new CancelledHandler());
}
public static void execute(String status) {
OrderStatusHandler handler = handlers.get(status);
if (handler != null) {
handler.handle();
} else {
throw new IllegalArgumentException("不明なステータス: " + status);
}
}
}
Java4. 利用側
public class Main {
public static void main(String[] args) {
OrderStatusContext.execute("NEW"); // 新規注文を登録しました
OrderStatusContext.execute("PROCESSING"); // 注文を処理中です
}
}
Java解説
- switch文の問題点
- caseが増えるとコードが肥大化する。
- フォールスルーの危険がある。
- 責務が集中してテストしづらい。
- 戦略パターンのメリット
- 各ステータスごとにクラスを分けるので責務が明確。
- 新しいステータス追加時はクラスとMap登録だけで済む。
- 単体テストが容易(例:
NewHandlerだけテスト可能)。 - switch文が消え、可読性・保守性が向上。


