Паттерны Проектирования. Стратегия



    Паттерны Проектирования. Стратегия

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

    Далее покажем пример реализации на языке C#.

    1. Создадим абстрактный класс Strategy:

    namespace Strategy
    {
        public abstract class Strategy
        {
            public abstract void CoastForRide();
        }
    }

    2. Создадим классы, которые будут унаследованы от класса Strategy и которые будут реализовывать метод CoastForRide.

    public class TaxiCar : Strategy
        {
            public override void CoastForRide()
            {
                Console.WriteLine(
                 "Called CoastForRide for TaxiCar");
            }
        }

     

     public class Bus : Strategy
        {
            public override void CoastForRide()
            {
                Console.WriteLine(
                  "Called CoastForRide for BUS");
            }
        }

     

     public class PersonalCar : Strategy
        {
            public override void CoastForRide()
            {
                Console.WriteLine(
                 "Called CoastForRide for PersonalCar");
            }
        }

    3. Создадим контекст, который использует Стратегию для решения определенной задачи, в нашем случае он будет заниматься транспортировкой в Аэропорт.

    public class TransportationToAirport
        {
            private Strategy _strategy;

            // Constructor
            public TransportationToAirport(Strategy strategy)
            {
                _strategy = strategy;
            }

            // Метод для установки стратегии.
            // Служит для смены стратегии во время выполнения.
            // В C# может быть реализован также как свойство записи.
            public void SetStrategy(Strategy strategy)
            {
                _strategy = strategy;
            }

            public void ExecuteOperation()
            {
                _strategy.CoastForRide();
            }
        }

    4. И наконец создадим класс приложения:

     class Program
        {
            static void Main(string[] args)
            {

                // Создаём контекст и инициализируем его первой стратегией.
                TransportationToAirport context = new TransportationToAirport(new TaxiCar());
                // Выполняем операцию контекста, которая использует первую стратегию.
                context.ExecuteOperation();
                // Заменяем в контексте первую стратегию второй.
                context.SetStrategy(new Bus());
                // Выполняем операцию контекста, которая теперь использует вторую стратегию.
                context.ExecuteOperation();
                // Заменяем в контексте вторую стратегию третьей.
                context.SetStrategy(new PersonalCar());
                // Выполняем операцию контекста, которая теперь использует третью стратегию.
                context.ExecuteOperation();

                Console.ReadKey();

            }
        }