Strategy (Стратегия) — это поведенческий паттерн проектирования, который определяет семейство алгоритмов, инкапсулирует каждый из них и делает их взаимозаменяемыми. Он позволяет изменять алгоритмы независимо от клиентов, которые ими пользуются.
// Интерфейс стратегии
public interface ISortStrategy
{
void Sort(List<int> dataset);
}
// Конкретные стратегии
public class BubbleSortStrategy : ISortStrategy
{
public void Sort(List<int> dataset)
{
Console.WriteLine("Sorting using Bubble Sort");
// Реализация алгоритма
}
}
public class QuickSortStrategy : ISortStrategy
{
public void Sort(List<int> dataset)
{
Console.WriteLine("Sorting using Quick Sort");
// Реализация алгоритма
}
}
// Контекст
public class Sorter
{
private ISortStrategy _strategy;
public Sorter(ISortStrategy strategy)
{
_strategy = strategy;
}
public void SetStrategy(ISortStrategy strategy)
{
_strategy = strategy;
}
public void ExecuteSort(List<int> dataset)
{
_strategy.Sort(dataset);
}
}
// Использование
var dataset = new List<int> { 1, 5, 3, 2, 4 };
var sorter = new Sorter(new BubbleSortStrategy());
sorter.ExecuteSort(dataset);
sorter.SetStrategy(new QuickSortStrategy());
sorter.ExecuteSort(dataset);
public interface IPaymentStrategy
{
void ProcessPayment(decimal amount);
}
public class CreditCardPayment : IPaymentStrategy { /*...*/ }
public class PayPalPayment : IPaymentStrategy { /*...*/ }
public class CryptoPayment : IPaymentStrategy { /*...*/ }
public class PaymentProcessor
{
private IPaymentStrategy _strategy;
public void SetPaymentStrategy(IPaymentStrategy strategy) => _strategy = strategy;
public void ExecutePayment(decimal amount) => _strategy.ProcessPayment(amount);
}
public interface IDiscountStrategy
{
decimal ApplyDiscount(decimal originalPrice);
}
public class RegularCustomerDiscount : IDiscountStrategy { /*...*/ }
public class VIPCustomerDiscount : IDiscountStrategy { /*...*/ }
public class HolidayDiscount : IDiscountStrategy { /*...*/ }
public interface IFilterStrategy
{
Bitmap ApplyFilter(Bitmap image);
}
public class BlackWhiteFilter : IFilterStrategy { /*...*/ }
public class SepiaFilter : IFilterStrategy { /*...*/ }
public class BlurFilter : IFilterStrategy { /*...*/ }
public class StrategyCache
{
private readonly Dictionary<string, ISortStrategy> _strategies;
public StrategyCache()
{
_strategies = new Dictionary<string, ISortStrategy>
{
["bubble"] = new BubbleSortStrategy(),
["quick"] = new QuickSortStrategy()
};
}
public ISortStrategy GetStrategy(string key) => _strategies[key];
}
public class Context
{
private Action<List<int>> _sortStrategy;
public void SetStrategy(Action<List<int>> strategy) => _sortStrategy = strategy;
public void Execute(List<int> data) => _sortStrategy(data);
}
// Использование
var context = new Context();
context.SetStrategy(data => data.Sort()); // Используем встроенный Sort
context.Execute(items);
паттерн Strategy особенно полезен, когда в системе есть несколько вариантов одного алгоритма или когда необходимо легко расширять функциональность новыми способами выполнения операций. Он помогает создавать гибкие, легко поддерживаемые системы, соответствующие современным принципам разработки ПО.