ここでは、switch 文を戦略パターンに置き換える練習問題を用意しました。
初心者でもステップを追って考えられるように、問題+ヒント+解答例を用意しています。
問題1:ユーザー権限ごとの処理
要件
- ユーザー種別
ADMIN,USER,GUESTがある - 処理内容:
ADMIN→ 管理者メニュー表示+アクセスログ記録USER→ ユーザーメニュー表示GUEST→ ゲストメニュー表示
スタートコード(switch 文)
String userType = "ADMIN";
switch (userType) {
case "ADMIN":
logAccess();
showAdminMenu();
break;
case "USER":
showUserMenu();
break;
case "GUEST":
showGuestMenu();
break;
default:
throw new IllegalArgumentException("不明なユーザー種別");
}
Java指示
- 上記を戦略パターンでリファクタして、
switch文を無くしてください。
問題2:交通信号(TrafficLight)制御
要件
- 信号の色
RED,YELLOW,GREENがある - 処理内容:
RED→ 止まれYELLOW→ 注意GREEN→ 進め
スタートコード(switch 文)
String light = "YELLOW";
switch (light) {
case "RED":
System.out.println("止まれ");
break;
case "YELLOW":
System.out.println("注意");
break;
case "GREEN":
System.out.println("進め");
break;
default:
throw new IllegalArgumentException("不明な信号");
}
Java指示
- 上記を戦略パターンで実装してください。
TrafficLightStrategyインターフェースを作って各色ごとのクラスを作る。
問題3:ポイント計算(ShopPoints)
要件
- 会員ランク
GOLD,SILVER,BRONZEがある - 購入金額に応じてポイント加算:
GOLD→ 5%SILVER→ 3%BRONZE→ 1%
スタートコード(switch 文)
String rank = "SILVER";
double purchase = 1000;
switch (rank) {
case "GOLD":
System.out.println(purchase * 0.05);
break;
case "SILVER":
System.out.println(purchase * 0.03);
break;
case "BRONZE":
System.out.println(purchase * 0.01);
break;
default:
throw new IllegalArgumentException("不明なランク");
}
Java指示
- 上記を戦略パターンで実装してください。
PointStrategyインターフェースを作り、ランクごとに計算方法をクラスに分ける。
ヒント(共通)
- インターフェースを作る
interface Strategy { void execute(); // または double calculate(double purchase); } - 各条件ごとにクラスを作る
- ADMIN/USER/GUEST
- RED/YELLOW/GREEN
- GOLD/SILVER/BRONZE
- ファクトリクラスまたは Map で戦略オブジェクトを取得する
Strategy strategy = StrategyFactory.getStrategy(key); strategy.execute(); switch文はファクトリ内部だけに残しても可(可読性と拡張性を優先)
