Java | 1 日 120 分 × 7 日アプリ学習 中級編:オブジェクト指向(OOP) - ポリモーフィズムアプリ

Web APP Java
スポンサーリンク
スポンサーリンク

ポリモーフィズム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戦略 通知戦略 フィルター戦略

手順はこうです。

  1. 共通インターフェース(または抽象クラス)を作る
  2. 戦略クラスを3つ作る
  3. サービス側で戦略を受け取る
  4. 戦略を差し替えて動きを変える

これができれば、 ポリモーフィズムを“設計の武器”として使えるようになります。

4日目で本当に掴んでほしいこと

ポリモーフィズム4日目で伝えたいのは、 「同じ命令で違う動き」は “戦略を差し替えるための設計の軸”である ということです。

使う側は同じ命令だけ使う 戦略はオブジェクトとして外出しする 戦略を差し替えるだけで動きが変わる if/switch は不要 未来の追加に強い アプリの構造が柔軟になる

これが、 オブジェクト指向の真の力です。

5日目以降は、 このポリモーフィズムを 「アプリ全体のアーキテクチャ」にどう活かすかを学んでいきます。

タイトルとURLをコピーしました