Что такое паттерн Strategy? Приведите пример реализации на C#.?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Что такое паттерн Strategy?
Strategy (Стратегия) — это поведенческий паттерн проектирования, который позволяет определять семейство алгоритмов, инкапсулировать каждый из них и делать их взаимозаменяемыми. Он позволяет изменять алгоритм независимо от клиента, который его использует. Основная идея — выделить изменяющуюся часть поведения в отдельные классы, чтобы можно было легко подменять одну стратегию другой без изменения основного класса.
Ключевые преимущества паттерна Strategy
- Устранение условных операторов: заменяет сложные условные конструкции (if/switch) на делегирование.
- Расширяемость: новые стратегии можно добавлять без изменения существующего кода.
- Принцип открытости/закрытости: основной класс закрыт для изменений, но открыт для расширения через новые стратегии.
- Тестируемость: каждую стратегию можно тестировать независимо.
Пример реализации на C#
Рассмотрим пример системы оплаты, где можно выбирать разные платежные методы (стратегии).
1. Определение интерфейса стратегии
Создаем интерфейс, который будет общим для всех алгоритмов оплаты.
// Интерфейс стратегии оплаты
public interface IPaymentStrategy
{
void ProcessPayment(decimal amount);
}
2. Реализация конкретных стратегий
Каждый платежный метод реализует интерфейс IPaymentStrategy.
// Стратегия для оплаты через кредитную карту
public class CreditCardPaymentStrategy : IPaymentStrategy
{
private readonly string _cardNumber;
private readonly string _cardHolder;
public CreditCardPaymentStrategy(string cardNumber, string cardHolder)
{
_cardNumber = cardNumber;
_cardHolder = cardHolder;
}
public void ProcessPayment(decimal amount)
{
Console.WriteLine($"Оплата {amount} руб. через кредитную карту {_cardNumber} (владелец: {_cardHolder})");
// Здесь может быть реальная логика обработки платежа
}
}
// Стратегия для оплаты через PayPal
public class PayPalPaymentStrategy : IPaymentStrategy
{
private readonly string _email;
public PayPalPaymentStrategy(string email)
{
_email = email;
}
public void ProcessPayment(decimal amount)
{
Console.WriteLine($"Оплата {amount} руб. через PayPal ({_email})");
// Логика интеграции с PayPal API
}
}
// Стратегия для оплаты через криптовалюту
public class CryptoPaymentStrategy : IPaymentStrategy
{
private readonly string _walletAddress;
public CryptoPaymentStrategy(string walletAddress)
{
_walletAddress = walletAddress;
}
public void ProcessPayment(decimal amount)
{
Console.WriteLine($"Оплата {amount} руб. через криптовалюту (адрес: {_walletAddress})");
// Логика обработки крипто-платежа
}
}
3. Класс, использующий стратегию (контекст)
Класс Order делегирует операцию оплаты текущей стратегии.
// Контекст, использующий стратегию
public class Order
{
private IPaymentStrategy _paymentStrategy;
public void SetPaymentStrategy(IPaymentStrategy paymentStrategy)
{
_paymentStrategy = paymentStrategy;
}
public void Pay(decimal amount)
{
if (_paymentStrategy == null)
throw new InvalidOperationException("Платежная стратегия не установлена");
_paymentStrategy.ProcessPayment(amount);
Console.WriteLine("Платеж успешно завершен!");
}
}
4. Использование в клиентском коде
Пример демонстрирует, как легко менять стратегии в процессе выполнения.
class Program
{
static void Main()
{
var order = new Order();
// Выбор стратегии оплаты
Console.WriteLine("Выберите метод оплаты:");
Console.WriteLine("1 - Кредитная карта");
Console.WriteLine("2 - PayPal");
Console.WriteLine("3 - Криптовалюта");
string choice = Console.ReadLine();
decimal amount = 5000.00m;
switch (choice)
{
case "1":
order.SetPaymentStrategy(new CreditCardPaymentStrategy("4111-1111-1111-1111", "Иван Петров"));
break;
case "2":
order.SetPaymentStrategy(new PayPalPaymentStrategy("client@example.com"));
break;
case "3":
order.SetPaymentStrategy(new CryptoPaymentStrategy("0xABCD1234"));
break;
default:
Console.WriteLine("Неверный выбор");
return;
}
order.Pay(amount);
// Динамическое изменение стратегии
Console.WriteLine("\nПереключаем на PayPal для следующего платежа...");
order.SetPaymentStrategy(new PayPalPaymentStrategy("newclient@example.com"));
order.Pay(2500.00m);
}
}
Применение в реальных проектах
Strategy часто используется в C# backend для:
- Расчетов и алгоритмов: разные формулы расчета цен, налогов, скидок.
- Валидации: различные стратегии проверки данных (строгая, мягкая).
- Сериализации: выбор формата (JSON, XML, Protobuf) для передачи данных.
- Логирования: стратегии записи логов (файл, база данных, внешний сервис).
- Аутентификации: разные методы (JWT, OAuth, биометрическая).
Этот паттерн особенно полезен в микросервисной архитектуре, где компоненты должны быть максимально гибкими и заменяемыми без рефакторинга основной бизнес-логики.