Где следует разместить переключатель в шаблоне стратегии без фабрики? - PullRequest
0 голосов
/ 19 февраля 2019

В каждом примере шаблона стратегии создается каждая возможная стратегия в функции Main, например:

Context cn = new Context(new CQuickSorter());
cn.Sort(myList);

cn = new Context(new CMergeSort());
cn.Sort(myList);

Но в некоторых местах нам приходится выбирать, какую стратегию нам следует использовать, где мы должны поместить переключательвыбрать правильную стратегию?В методе?Я видел класс с методом 'switch', который возвращал OBJECT - правильный экземпляр класса стратегии, но тогда это фабрика, а не шаблон стратегии.

Где должен быть «переключатель» в шаблоне стратегии без фабрики?У меня есть это в методе, как показано ниже - это нормально?

enum Operation
{
    Addition,
    Subtraction
}

public interface IMathOperation
{
    double PerformOperation(double A, double B);
}

class AddOperation : IMathOperation
{
    public double PerformOperation(double A, double B)
    {
        return A + B;
    }
}

class SubtractOperation : IMathOperation
{
    public double PerformOperation(double A, double B)
    {
        return A - B;
    }
}

class CalculateClientContext
{
    private IMathOperation _operation;

    public CalculateClientContext(IMathOperation operation)
    {
        _operation = operation;
    }

    public double Calculate(int value1, int value2)
    {
        return _operation.PerformOperation(value1, value2);
    }
}

class Service
{
    //In this method I have switch
    public double Calculate(Operation operation, int x, int y)
    {
        IMathOperation mathOperation = null;

        switch (operation)
        {
            case Operation.Addition:
                mathOperation = new AddOperation();
                break;
            case Operation.Subtraction:
                mathOperation = new SubtractOperation();
                break;
            default:
                throw new ArgumentException();
        }

        CalculateClientContext client = new CalculateClientContext(mathOperation);
        return client.Calculate(x, y);
    }
}

Ответы [ 2 ]

0 голосов
/ 19 февраля 2019

При применении внедрения зависимостей , доменные объекты должны создаваться и соединяться вместе (т.е. иметь свои зависимости, например, предоставленные стратегии) ​​в пределах составного корня .В современных практических терминах это означает, что ваш контейнер DI создает экземпляр и предоставляет стратегию для объекта контекста (клиента) на основе конфигурации.Нет switch.

0 голосов
/ 19 февраля 2019

Самый гибкий подход - отложить принятие решения («переключение») как можно дольше.Например, если вы начинаете с чего-то вроде этого:

Context cn = new Context(); // Don't care about the sorter yet...
cn.Sort(new CQuickSorter(), myList); // OK, NOW the sorter is needed, let's inject it now.

Вы можете принять решение в любой момент до вызова object.Sort().Решение может быть реализовано в простом блоке if-else или в сложной фабрике.В конце концов, лучшая реализация будет зависеть от сложности вашего проекта.Следовательно, нет строгого правила, определяющего, где вы должны поместить переключатель.

В качестве упражнения вы можете применять различные шаблоны создания, чтобы увидеть, как они действуют.Это поможет вам понять, когда использовать каждый шаблон проектирования.

...