Перейти к основному содержимому

Паттерн "Стратегия" (Strategy) в Java — выбор алгоритма в runtime

Разработчику Архитектору

Базовый обзор — в поведенческих паттернах. Практика на C# — в 117. Здесь — Java-реализация с переключением алгоритма в runtime.

Загрузка редактора схем…

Задача паттерна

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

Это избавляет от длинных if-else/switch в месте вызова.


Пример

interface DiscountStrategy {
double apply(double amount);
}

class NoDiscountStrategy implements DiscountStrategy {
@Override
public double apply(double amount) {
return amount;
}
}

class VipDiscountStrategy implements DiscountStrategy {
@Override
public double apply(double amount) {
return amount * 0.85;
}
}

class CheckoutService {
private DiscountStrategy strategy;

CheckoutService(DiscountStrategy strategy) {
this.strategy = strategy;
}

void setStrategy(DiscountStrategy strategy) {
this.strategy = strategy;
}

double total(double amount) {
return strategy.apply(amount);
}
}
CheckoutService checkout = new CheckoutService(new NoDiscountStrategy());
double a = checkout.total(1000);

checkout.setStrategy(new VipDiscountStrategy());
double b = checkout.total(1000);

Когда использовать

  • есть несколько способов выполнения одной операции;
  • алгоритм выбирается по контексту (роль, тариф, регион, тип запроса);
  • требуется расширять варианты без правки основного сервиса.

Strategy и Bridge

StrategyBridge
Что меняетсяАлгоритм одной операцииДве иерархии целиком
ЦельУбрать условную логикуУбрать комбинаторный взрыв классов

Bridge-практика — 131.


См. также

См. также

Другие статьи этого же раздела в боковом меню (как на странице "О разделе").