0Pricing
Java Academy · Урок

Шаблон Strategy: взаимозаменяемые алгоритмы

Инкапсулируйте алгоритмы сортировки или оплаты за интерфейсом Strategy для переключения во время выполнения.

«Шаблон Strategy: взаимозаменяемые алгоритмы» — бесплатный урок Java Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Java Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Java Academy содержит 4 уроков всего.

Назначение паттерна «Стратегия»

Стратегия определяет семейство алгоритмов, инкапсулирует каждый из них и делает их взаимозаменяемыми. Она позволяет изменять алгоритм независимо от контекста, который его использует.

Проблема без стратегии

Без стратегии выбор алгоритма скрыт в цепочках if-else. Добавление нового алгоритма означает изменение класса контекста, что нарушает принцип открытости/закрытости.

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
}

Интерфейс стратегии

Определите @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); }
}

Класс контекста

Контекст хранит ссылку на стратегию и делегирует ей выполнение алгоритма. Стратегию можно заменить во время выполнения.

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); }
}

Переключение стратегий во время выполнения

Меняйте стратегию на лету, не изменяя контекст. Благодаря этому поведение можно настраивать извне класса.

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

Стратегии-лямбды

Если интерфейс стратегии является @FunctionalInterface, используйте лямбда-выражения напрямую — для простых стратегий не нужны явные классы.

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

Стратегия обработки платежей

Классический пример из реального мира: контекст платежа принимает разные стратегии оплаты — банковскую карту, 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);

Стратегия сжатия

Обработчик файлов может использовать 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]; }
}

Сочетание стратегии и фабрики

Используйте фабрику, чтобы выбирать стратегию на основе конфигурации, сохраняя логику выбора отдельно от контекста и самих стратегий.

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

Стратегия и шаблонный метод

Шаблонный метод использует наследование: каркас находится в базовом классе, а подклассы переопределяют шаги. Стратегия использует композицию: алгоритм полностью вынесен наружу. Выбирайте стратегию для большей гибкости.

Стратегия в JDK

Comparator — каноническая реализация Стратегии в JDK. Передавайте разные компараторы в Collections.sort, чтобы изменить алгоритм упорядочивания, не затрагивая код коллекции.

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

Тестирование стратегий

Стратегии легко тестировать изолированно — просто вызовите strategy.sort(data) в модульном тесте. Внедряйте имитации стратегий в контекст, чтобы проверить логику оркестрации контекста.

Быстрая проверка

В чём заключается ключевое структурное различие между Стратегией и Шаблонным методом?

Повторение

Стратегия инкапсулирует взаимозаменяемые алгоритмы за общим интерфейсом. Используйте лямбда-выражения для простых стратегий, а классы — для сложных. Сочетайте стратегии с фабриками для выбора на основе конфигурации.

Часто задаваемые вопросы

Урок «Шаблон Strategy: взаимозаменяемые алгоритмы» бесплатный?

Да — полный текст урока «Шаблон Strategy: взаимозаменяемые алгоритмы» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Java Academy, подпишись на CoddyKit PRO. Курс Java Academy содержит 4 уроков всего.

Чему я научусь в уроке «Шаблон Strategy: взаимозаменяемые алгоритмы»?

Инкапсулируйте алгоритмы сортировки или оплаты за интерфейсом Strategy для переключения во время выполнения. Ты практикуешь Java Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Java Academy?

Предыдущий опыт не требуется. Java Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.

Сколько времени занимает урок «Шаблон Strategy: взаимозаменяемые алгоритмы»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Java Academy?

Да. Каждый урок Java Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Шаблон Observer: уведомление о событиях
  2. Шаблон Strategy: взаимозаменяемые алгоритмы
  3. Шаблон Command: инкапсуляция действий
  4. Шаблон Template Method: каркасы алгоритмов
← Назад к Java Academy