Назад к вопросам
Middle
72
questionbank

Для чего используется шаблон проектирования 'Стратегия'?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

Шаблон "Стратегия" используется для:

  1. Определения семейства алгоритмов: Каждый алгоритм инкапсулируется в отдельный класс, реализующий общий интерфейс.
  2. Взаимозаменяемости алгоритмов: Клиентский код может легко переключаться между различными алгоритмами во время выполнения, используя полиморфизм, без модификации клиентского класса.
  3. Устранения условной логики: Заменяет множественные операторы if/else или switch на основе типа алгоритма.
  4. Изоляции алгоритмов: Позволяет изменять или добавлять новые алгоритмы независимо от клиента, использующего их.

Пример структуры:

// Общий интерфейс для стратегий
interface PaymentStrategy {
    void pay(int amount);
}

// Конкретная стратегия: оплата картой
class CreditCardPayment implements PaymentStrategy {
    @Override
    public void pay(int amount) {
        // Логика оплаты картой
        System.out.println("Оплачено " + amount + " с помощью кредитной карты.");
    }
}

// Конкретная стратегия: оплата PayPal
class PaypalPayment implements PaymentStrategy {
    @Override
    public void pay(int amount) {
        // Логика оплаты PayPal
        System.out.println("Оплачено " + amount + " с помощью PayPal.");
    }
}

// Контекст, использующий стратегию
class ShoppingCart {
    private PaymentStrategy paymentStrategy;

    public void setPaymentStrategy(PaymentStrategy paymentStrategy) {
        this.paymentStrategy = paymentStrategy;
    }

    public void checkout(int totalAmount) {
        // Использование стратегии для оплаты
        paymentStrategy.pay(totalAmount);
    }
}

// Пример использования
// public class Main {
//     public static void main(String[] args) {
//         ShoppingCart cart = new ShoppingCart();

//         // Использование стратегии оплаты картой
//         cart.setPaymentStrategy(new CreditCardPayment());
//         cart.checkout(100);

//         // Переключение на стратегию оплаты PayPal
//         cart.setPaymentStrategy(new PaypalPayment());
//         cart.checkout(200);
//     }
// }