🎉 Ура! Після трьох років роботи, я нарешті випустив англійську версію книжки про патерни! Ось вона »

C#: Стратегія

Strategy Стратегія Strategy

Стратегія — це поведінковий патерн, який виносить набір алгоритмів у власні класи і робить їх взаємозамінними.

Інші об’єкти містять посилання на об’єкт-стратегію та делегують їй роботу. Програма може підмінити цей об’єкт іншим, якщо потрібен інший спосіб вирішення завдання.

Детальніше про Стратегію

Особливості паттерна на C#

Складність:

Популярність:

Застосування: Стратегія часто використовується в C#-коді, особливо там, де потрібно підміняти алгоритм під час виконання програми. Починаючи з Java 8, багато прикладів стратегії можна замінити простими lambda-виразами.

Ознаки застосування патерну: Клас делегує виконання вкладеному об’єктові абстрактного типу чи інтерфейсу.

Приклад: Структура патерну

Цей приклад показує структуру патерну Стратегія, а саме — з яких класів він складається, які ролі ці класи виконують і як вони взаємодіють один з одним.

Program.cs: Приклад структури патерну

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace RefactoringGuru.DesignPatterns.Strategy.Structural
{
    class Context
    {
        private Strategy _strategy;

        public Context()
        { }

        public Context(Strategy strategy)
        {
            this._strategy = strategy;
        }

        public void setStrategy(Strategy strategy)
        {
            this._strategy = strategy;
        }

        public void doSomeBusinessLogic()
        {
            Console.Write("Context: Sorting data using the strategy (not sure how it'll do it)\n");
            var result = this._strategy.doAlgorithm(new List<string> { "a", "b", "c", "d", "e" });

            string result_str = string.Empty;
            foreach(var element in result as List<string>)
            {
                result_str += element + ",";
            }

            Console.Write(result_str);
        }
    }

    interface Strategy
    {
        object doAlgorithm(object data);
    }

    class ConcreteStrategyA : Strategy
    {
        public object doAlgorithm(object data)
        {
            var list = data as List<string>;
            list.Sort();

            return list;
        }
    }

    class ConcreteStrategyB : Strategy
    {
        public object doAlgorithm(object data)
        {
            var list = data as List<string>;
            list.Sort();
            list.Reverse();

            return list;
        }
    }

    class Client
    {
        public static void ClientCode()
        {
            var context = new Context();

            Console.Write("Client: Strategy is set to normal sorting.\n");
            context.setStrategy(new ConcreteStrategyA());
            context.doSomeBusinessLogic();
            Console.Write("\n");
            Console.Write("Client: Strategy is set to reverse sorting.\n");
            context.setStrategy(new ConcreteStrategyB());
            context.doSomeBusinessLogic();

            Console.Write("\n");
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Client.ClientCode();
        }
    }
}

Output.txt: Результат виконання

Client: Strategy is set to normal sorting.
Context: Sorting data using the strategy (not sure how it'll do it)
a,b,c,d,e

Client: Strategy is set to reverse sorting.
Context: Sorting data using the strategy (not sure how it'll do it)
e,d,c,b,a