では「練習問題3:ユーザー権限判定」を 戦略パターンでリファクタリングした解答例を示します。
元のコード(フォールスルーあり)
switch (role) {
case "ADMIN":
case "SUPERUSER":
System.out.println("全権限を付与");
break;
case "USER":
case "GUEST":
System.out.println("制限付き権限を付与");
break;
default:
System.out.println("不明な権限");
}
Java👉 「ADMIN」「SUPERUSER」をまとめて全権限、「USER」「GUEST」をまとめて制限付き権限にするためにフォールスルーを使っています。
戦略パターンによるリファクタ解答
1. 戦略インターフェース
interface RoleStrategy {
void assignPermissions();
}
Java2. 具体的な戦略クラス
class FullPermissionStrategy implements RoleStrategy {
public void assignPermissions() {
System.out.println("全権限を付与");
}
}
class LimitedPermissionStrategy implements RoleStrategy {
public void assignPermissions() {
System.out.println("制限付き権限を付与");
}
}
class UnknownPermissionStrategy implements RoleStrategy {
public void assignPermissions() {
System.out.println("不明な権限");
}
}
Java3. コンテキスト(戦略選択)
import java.util.HashMap;
import java.util.Map;
class RoleContext {
private static final Map<String, RoleStrategy> strategies = new HashMap<>();
static {
// 全権限グループ
strategies.put("ADMIN", new FullPermissionStrategy());
strategies.put("SUPERUSER", new FullPermissionStrategy());
// 制限付き権限グループ
strategies.put("USER", new LimitedPermissionStrategy());
strategies.put("GUEST", new LimitedPermissionStrategy());
}
public static void execute(String role) {
RoleStrategy strategy = strategies.getOrDefault(role, new UnknownPermissionStrategy());
strategy.assignPermissions();
}
}
Java4. 利用側
public class Main {
public static void main(String[] args) {
RoleContext.execute("ADMIN"); // 全権限を付与
RoleContext.execute("USER"); // 制限付き権限を付与
RoleContext.execute("UNKNOWN"); // 不明な権限
}
}
Java解説
- switchのフォールスルーを排除
→ Mapに「権限名」と「戦略クラス」を紐付けることで安全に分類。 - メリット
- フォールスルーの危険がなくなる。
- 新しい権限を追加する場合はMapに登録するだけ。
- 各戦略クラスを単体テスト可能。
- デメリット
- クラス数が増えるので小規模な処理には冗長。
- ただし業務コードでは「責務分離」「拡張性」が重要なので有効。
まとめ
- フォールスルーを使わずに「複数条件をまとめる」には、戦略パターン+Map登録が有効。
- ユーザー権限判定のような「グループ化された条件分岐」に適している。


