Шаблон 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 — локальная установка не требуется.
Все уроки этого курса
- Шаблон Observer: уведомление о событиях
- Шаблон Strategy: взаимозаменяемые алгоритмы
- Шаблон Command: инкапсуляция действий
- Шаблон Template Method: каркасы алгоритмов