← Назад к вопросам

Что такое паттерн стратегия?

1.8 Middle🔥 171 комментариев
#SOLID и паттерны проектирования

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Паттерн Strategy (Стратегия)

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

Основная идея

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

Компоненты паттерна

  1. Strategy - интерфейс, определяющий общий способ выполнения алгоритма
  2. ConcreteStrategy - конкретные реализации алгоритмов
  3. 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 - выбор алгоритма во время выполнения

Недостатки

  • Может привести к дублированию кода, если стратегии очень похожи
  • Увеличивает количество классов
  • Добавляет сложность для простых случаев

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

  • Существует множество похожих классов, отличающихся алгоритмом
  • Нужно выбирать алгоритм во время выполнения
  • Необходимо избежать условных операторов для выбора алгоритма
  • Каждый алгоритм должен быть инкапсулирован