Паттерн 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 — поведенческий паттерн, который помогает выносить алгоритмы в отдельные классы и менять их динамически. Он широко используется в системах оплаты, маршрутизации, сортировке и других задачах, где нужно гибко выбирать способ выполнения действия.