Основы ООП на C# // Модуль 4: Паттерны ООП
Strategy

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

Когда применять Strategy

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

PlantUML-диаграмма

UML диаграмма Strategy
// Интерфейс стратегии
public interface IPaymentStrategy
{
    void Pay(decimal amount);
}

// Конкретные стратегии
public class CreditCardPayment : IPaymentStrategy
{
    public void Pay(decimal amount)
    {
        Console.WriteLine($"Оплата {amount:C} банковской картой.");
    }
}

public class PayPalPayment : IPaymentStrategy
{
    public void Pay(decimal amount)
    {
        Console.WriteLine($"Оплата {amount:C} через PayPal.");
    }
}

public class CryptoPayment : IPaymentStrategy
{
    public void Pay(decimal amount)
    {
        Console.WriteLine($"Оплата {amount:C} в криптовалюте.");
    }
}

// Контекст
public class PaymentContext
{
    private IPaymentStrategy _strategy;

    public PaymentContext(IPaymentStrategy strategy)
    {
        _strategy = strategy;
    }

    public void SetStrategy(IPaymentStrategy strategy)
    {
        _strategy = strategy;
    }

    public void ExecutePayment(decimal amount)
    {
        _strategy.Pay(amount);
    }
}

// Клиентский код
class Program
{
    static void Main()
    {
        var payment = new PaymentContext(new CreditCardPayment());
        payment.ExecutePayment(1000m);

        payment.SetStrategy(new PayPalPayment());
        payment.ExecutePayment(250m);

        payment.SetStrategy(new CryptoPayment());
        payment.ExecutePayment(0.05m);
    }
}

Плюсы и минусы

Плюсы Минусы
Избавляет от условных операторов для выбора поведения Увеличивает количество классов
Позволяет менять поведение во время выполнения Контекст должен знать о существовании разных стратегий
Упрощает добавление новых алгоритмов без изменения существующего кода Иногда усложняет систему, если стратегий слишком много

Заключение

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