ポリモーフィズム4日目のゴール
4日目のテーマは 「同じ命令で違う動き」=ポリモーフィズムを“アプリ全体の構造”に活かすこと です。
1日目:魔法のような「同じ命令で違う動き」を体験 2日目:if/switch を消して使う側のコードをシンプルに 3日目:未来の追加に強い設計(OCP)として使う
そして4日目は、 アプリの「流れ」そのものをポリモーフィズムで差し替える という一段上の使い方に踏み込みます。
ここからが、オブジェクト指向の“設計の醍醐味”です。
アプリの「流れ」を差し替えるという発想
ポリモーフィズムは「処理の戦略を入れ替える」ための仕組み
ポリモーフィズムは 「同じ命令で違う動き」を生むだけではありません。
もっと強力なのは、
アプリの処理の流れそのものを、 オブジェクトを差し替えるだけで変えられること。
つまり、 「戦略(Strategy)」を入れ替えるための仕組みです。
例えば、
ログの出力方法 支払い方法 並び替えの方法 検索の方法 ゲームの敵AIの行動パターン
これらはすべて “戦略”として差し替えられる のです。
例題:並び替えアプリで「戦略の差し替え」を体験する
Sorter の sort() が戦略ごとに違う動きをする
まず、共通インターフェースを作ります。
public interface Sorter {
List<Integer> sort(List<Integer> list);
}
Java昇順ソート。
public class AscSorter implements Sorter {
@Override
public List<Integer> sort(List<Integer> list) {
List<Integer> copy = new ArrayList<>(list);
Collections.sort(copy);
return copy;
}
}
Java降順ソート。
public class DescSorter implements Sorter {
@Override
public List<Integer> sort(List<Integer> list) {
List<Integer> copy = new ArrayList<>(list);
copy.sort(Collections.reverseOrder());
return copy;
}
}
Javaランダムソート。
public class RandomSorter implements Sorter {
@Override
public List<Integer> sort(List<Integer> list) {
List<Integer> copy = new ArrayList<>(list);
Collections.shuffle(copy);
return copy;
}
}
Java使う側はこう。
public class SortService {
private Sorter sorter;
public SortService(Sorter sorter) {
this.sorter = sorter;
}
public List<Integer> execute(List<Integer> list) {
return sorter.sort(list);
}
}
Javaここで起きていることは、
Sorter を差し替えるだけで アプリの「並び替え戦略」が丸ごと変わる
という構造です。
昇順にしたければ:
SortService service = new SortService(new AscSorter());
Java降順にしたければ:
SortService service = new SortService(new DescSorter());
Javaランダムにしたければ:
SortService service = new SortService(new RandomSorter());
Java使う側のコードは一切変わらない。 戦略オブジェクトを差し替えるだけで動きが変わる。
これが、ポリモーフィズムの“戦略としての使い方”です。
重要ポイントの深掘り:ポリモーフィズムは「戦略パターン」の基礎
Strategy パターンは「ポリモーフィズムの応用形」
実はこの構造は、 デザインパターンで有名な Strategy パターン の基本形です。
Strategy パターンとは、
処理の戦略をオブジェクトとして外出しし、 差し替え可能にする設計。
Sorter の例はまさにそれです。
アプリの「流れ」を変えたいとき、 if/switch を増やすのではなく 戦略オブジェクトを差し替える。
これが、 ポリモーフィズムの“本気の使い方”です。
例題:ゲームAIで「戦略の差し替え」を体験する
EnemyAI の act() が戦略ごとに違う動きをする
ゲームの敵キャラの行動を考えます。
共通インターフェース。
public interface EnemyAI {
void act();
}
Java攻撃型AI。
public class AggressiveAI implements EnemyAI {
@Override
public void act() {
System.out.println("敵は攻撃してきた!");
}
}
Java防御型AI。
public class DefensiveAI implements EnemyAI {
@Override
public void act() {
System.out.println("敵は防御している…");
}
}
Java逃走型AI。
public class EscapeAI implements EnemyAI {
@Override
public void act() {
System.out.println("敵は逃げ出した!");
}
}
Java使う側はこう。
public class Enemy {
private EnemyAI ai;
public Enemy(EnemyAI ai) {
this.ai = ai;
}
public void update() {
ai.act();
}
}
Java敵の行動を変えたければ、 AI を差し替えるだけ。
Enemy enemy = new Enemy(new AggressiveAI());
enemy.update(); // 攻撃
enemy = new Enemy(new DefensiveAI());
enemy.update(); // 防御
enemy = new Enemy(new EscapeAI());
enemy.update(); // 逃走
Javaゲームの行動ロジックを if/switch で書く必要がない。 戦略オブジェクトを差し替えるだけで動きが変わる。
これが、ポリモーフィズムの“設計としての強さ”です。
重要ポイントの深掘り:ポリモーフィズムは「条件分岐の代わり」ではなく「設計の軸」
if を消すだけではなく、アプリの構造を柔軟にする
ポリモーフィズムは 「if を消すための仕組み」ではありません。
本質は、
アプリの構造を柔軟にし、 変更や拡張に強くするための設計の軸。
戦略を差し替える 振る舞いを差し替える 処理の流れを差し替える
これらを 「使う側のコードを変えずに」実現できる。
これが、 オブジェクト指向の真の強さです。
例題:検索アプリで「戦略の差し替え」を体験する
Searcher の search() が検索方法ごとに違う動きをする
共通インターフェース。
public interface Searcher {
List<String> search(String keyword);
}
Java部分一致検索。
public class PartialSearcher implements Searcher {
@Override
public List<String> search(String keyword) {
System.out.println("部分一致検索を実行");
return List.of("結果1", "結果2");
}
}
Java前方一致検索。
public class PrefixSearcher implements Searcher {
@Override
public List<String> search(String keyword) {
System.out.println("前方一致検索を実行");
return List.of("結果A", "結果B");
}
}
Java正規表現検索。
public class RegexSearcher implements Searcher {
@Override
public List<String> search(String keyword) {
System.out.println("正規表現検索を実行");
return List.of("結果X", "結果Y");
}
}
Java使う側はこう。
public class SearchService {
private Searcher searcher;
public SearchService(Searcher searcher) {
this.searcher = searcher;
}
public List<String> execute(String keyword) {
return searcher.search(keyword);
}
}
Java検索方法を変えたければ、 Searcher を差し替えるだけ。
4日目の実践:「戦略を差し替える設計」を自分で作る
どんなテーマでもOK。戦略を3つ作って差し替えてみる
今日やってほしい練習は、 自分で「戦略」を作って差し替えることです。
テーマは何でもOKです。
描画戦略 並び替え戦略 検索戦略 支払い戦略 ゲームAI戦略 通知戦略 フィルター戦略
手順はこうです。
- 共通インターフェース(または抽象クラス)を作る
- 戦略クラスを3つ作る
- サービス側で戦略を受け取る
- 戦略を差し替えて動きを変える
これができれば、 ポリモーフィズムを“設計の武器”として使えるようになります。
4日目で本当に掴んでほしいこと
ポリモーフィズム4日目で伝えたいのは、 「同じ命令で違う動き」は “戦略を差し替えるための設計の軸”である ということです。
使う側は同じ命令だけ使う 戦略はオブジェクトとして外出しする 戦略を差し替えるだけで動きが変わる if/switch は不要 未来の追加に強い アプリの構造が柔軟になる
これが、 オブジェクト指向の真の力です。
5日目以降は、 このポリモーフィズムを 「アプリ全体のアーキテクチャ」にどう活かすかを学んでいきます。


