0Pricing
Java Academy · レッスン

Strategy パターン:交換可能なアルゴリズム

ソートや決済のアルゴリズムを Strategy インターフェースの背後にカプセル化し、実行時に切り替えます。

「Strategy パターン:交換可能なアルゴリズム」はCoddyKit上の無料Java Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはJava Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Java Academyコースには全4レッスンが含まれています。

Strategy の目的

Strategy はアルゴリズムのファミリーを定義し、それぞれをカプセル化して、相互に交換できるようにします。アルゴリズムを、それを利用するコンテキストから独立して変更できるようにします。

Strategy がない場合の問題

Strategy がないと、アルゴリズムの選択が if-else の連鎖に埋め込まれます。新しいアルゴリズムを追加するにはコンテキストクラスを編集する必要があり、Open/Closed Principle に違反します。

public double sort(List<Integer> data, String method) {
    if (method.equals("bubble")) { /* bubble sort */ }
    else if (method.equals("merge")) { /* merge sort */ }
    // adding quicksort requires editing this class
}

Strategy インターフェース

アルゴリズムの契約を表す @FunctionalInterface または通常のインターフェースを定義します。各実装は異なるアルゴリズムをカプセル化します。

public interface SortStrategy {
    void sort(List<Integer> data);
}
public class BubbleSortStrategy implements SortStrategy {
    public void sort(List<Integer> data) { /* bubble sort logic */ }
}
public class QuickSortStrategy implements SortStrategy {
    public void sort(List<Integer> data) { Collections.sort(data); }
}

コンテキストクラス

コンテキストは Strategy への参照を保持し、アルゴリズムの実行を委譲します。Strategy は実行時に交換できます。

public class Sorter {
    private SortStrategy strategy;
    public Sorter(SortStrategy strategy) { this.strategy = strategy; }
    public void setStrategy(SortStrategy s) { this.strategy = s; }
    public void sort(List<Integer> data)   { strategy.sort(data); }
}

実行時の Strategy 切り替え

コンテキストを変更せずに、Strategy をその場で切り替えられます。これにより、クラスの外部から動作を設定できます。

Sorter sorter = new Sorter(new BubbleSortStrategy());
sorter.sort(data);                          // uses bubble sort
sorter.setStrategy(new QuickSortStrategy());
sorter.sort(data);                          // now uses quick sort

ラムダによる Strategy

Strategy インターフェースが @FunctionalInterface の場合は、ラムダを直接使用できます。単純な Strategy であれば、明示的なクラスを定義する必要はありません。

Sorter sorter = new Sorter(data -> Collections.sort(data)); // lambda strategy
// or method reference:
Sorter sorter2 = new Sorter(Collections::sort);

決済処理のための Strategy

典型的な実例は、決済コンテキストが複数の決済 Strategy(クレジットカード、PayPal、暗号資産)を受け入れる方法です。コンテキストはそれぞれの詳細を知る必要がありません。

public interface PaymentStrategy {
    void pay(double amount);
}
new PaymentProcessor(new CreditCardStrategy("4111...")).pay(99.99);
new PaymentProcessor(new PayPalStrategy("user@email.com")).pay(99.99);

圧縮のための Strategy

ファイル処理では CompressionStrategy を使用できます。ファイル処理パイプラインを変更せずに、GZIP、ZIP、LZ4 を組み込めます。

public interface CompressionStrategy {
    byte[] compress(byte[] data) throws IOException;
}
public class GzipStrategy implements CompressionStrategy {
    public byte[] compress(byte[] data) throws IOException { /* gzip */ return new byte[0]; }
}

Strategy と Factory の組み合わせ

設定に基づく Strategy の選択には Factory を使用し、選択ロジックをコンテキストと Strategy 自体の両方から分離します。

SortStrategy strategy = switch (config.getSortMethod()) {
    case "bubble" -> new BubbleSortStrategy();
    case "merge"  -> new MergeSortStrategy();
    default       -> Collections::sort;
};
new Sorter(strategy).sort(data);

Strategy と Template Method の比較

Template Method は継承を使います。骨格は基底クラスに置き、サブクラスが手順をオーバーライドします。Strategy はコンポジションを使い、アルゴリズム全体を外部に置きます。より柔軟性が必要な場合は Strategy を優先してください。

JDKにおけるStrategy

ComparatorはJDKにおける代表的なStrategyです。異なるComparatorをCollections.sortに渡すことで、コレクションのコードに手を加えずに並べ替えアルゴリズムを変更できます。

List<String> names = List.of("Bob", "Alice", "Charlie");
names.stream().sorted(Comparator.comparingInt(String::length)).forEach(System.out::println);

Strategyのテスト

Strategyは単体で簡単にテストできます。ユニットテストでstrategy.sort(data)を呼び出すだけです。コンテキストにモックのStrategyを注入すると、コンテキストのオーケストレーションロジックをテストできます。

確認問題

StrategyとTemplate Methodの構造上の主な違いは何ですか。

まとめ

Strategyは、交換可能なアルゴリズムを共通のインターフェースの背後にカプセル化します。単純なStrategyにはラムダ式を、複雑なものにはクラスを使用します。設定に基づく選択にはファクトリと組み合わせます。

よくある質問

「Strategy パターン:交換可能なアルゴリズム」レッスンは無料ですか?

はい。「Strategy パターン:交換可能なアルゴリズム」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Java Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Java Academyコースには全4レッスンが含まれています。

「Strategy パターン:交換可能なアルゴリズム」で何を学びますか?

ソートや決済のアルゴリズムを Strategy インターフェースの背後にカプセル化し、実行時に切り替えます。 ブラウザで直接実行するハンズオンコードでJava Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Java Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのJava Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。

「Strategy パターン:交換可能なアルゴリズム」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このJava Academyレッスンでコードを書いて実行できますか?

はい。すべてのJava Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. Observer パターン:イベント通知
  2. Strategy パターン:交換可能なアルゴリズム
  3. Command パターン:操作のカプセル化
  4. Template Method:アルゴリズムの骨格定義
← Java Academyに戻る