では、ADMIN / USER / GUEST の全ユーザー種別をまとめた処理フロー図を作ります。
左に「フォールスルー switch」、右に「戦略パターン」の比較を並べてみます。
フォールスルー switch 戦略パターン
─────────────────────────────
userType = "ADMIN" userType = "ADMIN"
│ │
▼ ▼
┌─────────┐ ┌──────────────┐
│ switch開始 │ │ UserFactory.getStrategy │
└─────────┘ └──────────────┘
│ │
▼ ▼
┌─────────┐ ┌─────────┐
│ case "ADMIN" │ │ AdminUser │
└─────────┘ └─────────┘
│ │
notifyAdmin() ← ADMIN 特有 execute()
│ │
▼ ▼
フォールスルーで ┌──────────────┐
case "USER" 実行 │ AdminUser.execute() │
│ │ 1) notifyAdmin() │
showMenu() ← 共通処理 │ 2) showMenu() │
│ └──────────────┘
▼ │
switch終了 処理終了
────────────────
userType = "USER" userType = "USER"
│ │
▼ ▼
┌─────────┐ ┌─────────┐
│ case "USER" │ │ NormalUser │
└─────────┘ └─────────┘
│ │
showMenu() ← USER の処理 execute()
│ │
switch終了 showMenu()
│
処理終了
────────────────
userType = "GUEST" userType = "GUEST"
│ │
▼ ▼
┌─────────┐ ┌─────────┐
│ case "GUEST" │ │ GuestUser │
└─────────┘ └─────────┘
│ │
showGuestMenu() execute()
│ │
switch終了 showGuestMenu()
│
処理終了
解説
- フォールスルー switch
- ADMIN の場合のみ意図的に USER の処理に流れる
- 読む人は「break がない → 下に流れる」ことを理解しておく必要がある
- USER / GUEST は独立処理
- 戦略パターン
- 各ユーザー種別の処理は execute() 内にまとめられて完結
- Main 側では 単一の
execute()呼び出し だけ - フォールスルーなし、処理順序が直感的で安全
- 全体比較ポイント
- フォールスルー switch は短く書けるが、意図を知っていないと理解しづらい
- 戦略パターンは少しクラスが増えるが、拡張性・保守性・テストのしやすさが格段に上がる
希望であれば、この図をさらに 「ユーザーが増えた場合(例: SUPER_ADMIN, MODERATOR)」も簡単に追加できるバージョン にして、
「switch と戦略パターンの拡張性の差」を一目で示すこともできます。
作りますか?
