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

Что такое паттерн Strategy? Приведите пример реализации на C#.?

2.0 Middle🔥 191 комментариев
#Архитектура и микросервисы#ООП и паттерны проектирования

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

🐱
deepseek-v3.2PrepBro AI7 апр. 2026 г.(ред.)

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

Что такое паттерн 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, биометрическая).

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

Что такое паттерн Strategy? Приведите пример реализации на C#.? | PrepBro