では「練習問題1:季節判定」を 戦略パターンでリファクタリングした解答例と解説を示します。
元のコード(フォールスルーあり)
switch (month) {
case 3:
case 4:
case 5:
System.out.println("春");
break;
case 6:
case 7:
case 8:
System.out.println("夏");
break;
case 9:
case 10:
case 11:
System.out.println("秋");
break;
case 12:
case 1:
case 2:
System.out.println("冬");
break;
default:
System.out.println("不正な月です");
}
Java👉 複数の月をまとめるためにフォールスルーを使っています。
戦略パターンによるリファクタ解答
1. 戦略インターフェース
interface SeasonStrategy {
void printSeason();
}
Java2. 具体的な戦略クラス
class SpringStrategy implements SeasonStrategy {
public void printSeason() {
System.out.println("春");
}
}
class SummerStrategy implements SeasonStrategy {
public void printSeason() {
System.out.println("夏");
}
}
class AutumnStrategy implements SeasonStrategy {
public void printSeason() {
System.out.println("秋");
}
}
class WinterStrategy implements SeasonStrategy {
public void printSeason() {
System.out.println("冬");
}
}
Java3. コンテキスト(戦略選択)
import java.util.HashMap;
import java.util.Map;
class SeasonContext {
private static final Map<Integer, SeasonStrategy> strategies = new HashMap<>();
static {
// 春
strategies.put(3, new SpringStrategy());
strategies.put(4, new SpringStrategy());
strategies.put(5, new SpringStrategy());
// 夏
strategies.put(6, new SummerStrategy());
strategies.put(7, new SummerStrategy());
strategies.put(8, new SummerStrategy());
// 秋
strategies.put(9, new AutumnStrategy());
strategies.put(10, new AutumnStrategy());
strategies.put(11, new AutumnStrategy());
// 冬
strategies.put(12, new WinterStrategy());
strategies.put(1, new WinterStrategy());
strategies.put(2, new WinterStrategy());
}
public static void execute(int month) {
SeasonStrategy strategy = strategies.get(month);
if (strategy != null) {
strategy.printSeason();
} else {
throw new IllegalArgumentException("不正な月です: " + month);
}
}
}
Java4. 利用側
public class Main {
public static void main(String[] args) {
SeasonContext.execute(4); // 春
SeasonContext.execute(8); // 夏
SeasonContext.execute(11); // 秋
SeasonContext.execute(1); // 冬
}
}
Java解説
- switch文のフォールスルーを排除
→ 月ごとに戦略クラスをMapに登録することで、まとめ処理を安全に実現。 - メリット
- フォールスルーの危険がなくなる。
- 新しい季節や分類を追加する場合はMapに登録するだけ。
- 各戦略クラスを単体テスト可能。
- デメリット
- クラス数が増えるので小規模な処理にはやや冗長。
- ただし業務コードでは「責務分離」「拡張性」が重要なので有効。
まとめ
- フォールスルーを使わずに「複数条件をまとめる」には、戦略パターン+Map登録が有効。
- 季節判定のような「分類処理」に適している。
- 実務では「ステータス管理」「エラーレベル分類」などでも同じ手法が使える。


