Java | 「switch → 戦略パターン」リファクタ練習問題

Java Java
スポンサーリンク


ここでは、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 インターフェースを作り、ランクごとに計算方法をクラスに分ける。

ヒント(共通)

  1. インターフェースを作る interface Strategy { void execute(); // または double calculate(double purchase); }
  2. 各条件ごとにクラスを作る
    • ADMIN/USER/GUEST
    • RED/YELLOW/GREEN
    • GOLD/SILVER/BRONZE
  3. ファクトリクラスまたは Map で戦略オブジェクトを取得する Strategy strategy = StrategyFactory.getStrategy(key); strategy.execute();
  4. switch 文はファクトリ内部だけに残しても可(可読性と拡張性を優先)
Java
スポンサーリンク
シェアする
@lifehackerをフォローする
スポンサーリンク
タイトルとURLをコピーしました