← Назад к вопросам
Что такое паттерн стратегия?
1.8 Middle🔥 171 комментариев
#SOLID и паттерны проектирования
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Паттерн Strategy (Стратегия)
Strategy - это поведенческий паттерн проектирования, который определяет семейство алгоритмов, инкапсулирует каждый из них и делает их взаимозаменяемыми. Паттерн позволяет выбирать алгоритм во время выполнения программы.
Основная идея
Вместо того чтобы реализовывать несколько похожих алгоритмов в одном классе с условными операторами, Strategy позволяет выделить каждый алгоритм в отдельный класс и сделать их взаимозаменяемыми через общий интерфейс.
Компоненты паттерна
- Strategy - интерфейс, определяющий общий способ выполнения алгоритма
- ConcreteStrategy - конкретные реализации алгоритмов
- Context - класс, использующий стратегию
Пример реализации
// Интерфейс стратегии
interface PaymentStrategy {
void pay(double amount);
}
// Конкретные стратегии
class CreditCardPayment implements PaymentStrategy {
private String cardNumber;
public CreditCardPayment(String cardNumber) {
this.cardNumber = cardNumber;
}
@Override
public void pay(double amount) {
System.out.println("Оплата " + amount + " с помощью кредитной карты " + cardNumber);
}
}
class PayPalPayment implements PaymentStrategy {
private String email;
public PayPalPayment(String email) {
this.email = email;
}
@Override
public void pay(double amount) {
System.out.println("Оплата " + amount + " через PayPal аккаунт " + email);
}
}
class BitcoinPayment implements PaymentStrategy {
private String walletAddress;
public BitcoinPayment(String walletAddress) {
this.walletAddress = walletAddress;
}
@Override
public void pay(double amount) {
System.out.println("Оплата " + amount + " BTC на адрес " + walletAddress);
}
}
// Context - класс, использующий стратегию
class ShoppingCart {
private PaymentStrategy paymentStrategy;
private double totalPrice;
public ShoppingCart(double totalPrice) {
this.totalPrice = totalPrice;
}
// Установить стратегию оплаты
public void setPaymentStrategy(PaymentStrategy strategy) {
this.paymentStrategy = strategy;
}
// Выполнить оплату
public void checkout() {
if (paymentStrategy == null) {
throw new IllegalStateException("Стратегия оплаты не установлена");
}
paymentStrategy.pay(totalPrice);
}
}
Использование паттерна
public class Main {
public static void main(String[] args) {
ShoppingCart cart = new ShoppingCart(100.0);
// Оплата кредитной картой
cart.setPaymentStrategy(new CreditCardPayment("1234-5678-9012-3456"));
cart.checkout();
// Переключение на PayPal
cart.setPaymentStrategy(new PayPalPayment("user@example.com"));
cart.checkout();
// Переключение на Bitcoin
cart.setPaymentStrategy(new BitcoinPayment("1A1z7agoat"));
cart.checkout();
}
}
Преимущества
- Гибкость - легко добавлять новые стратегии без изменения существующего кода
- Избежание условных операторов - вместо if-else используются объекты
- Инкапсуляция - алгоритмы изолированы от клиента
- Runtime selection - выбор алгоритма во время выполнения
Недостатки
- Может привести к дублированию кода, если стратегии очень похожи
- Увеличивает количество классов
- Добавляет сложность для простых случаев
Когда использовать
- Существует множество похожих классов, отличающихся алгоритмом
- Нужно выбирать алгоритм во время выполнения
- Необходимо избежать условных операторов для выбора алгоритма
- Каждый алгоритм должен быть инкапсулирован