Как избежать необходимости знания кода пользователя и создания конкретной стратегии в шаблоне стратегии - PullRequest
0 голосов
/ 24 февраля 2019

Strategy pattern разъединяет код контекста и используемые им стратегии (или алгоритм или политику).Он имеет преимущество перед Template Pattern, поскольку позволяет динамически изменять поведение и использует композицию с делегированием для достижения этого.Ниже приведен такой пример.

public class Context{
    private Policy policy;

    public void setPolicy(Policy policy){
        this.policy = policy;
    }

    public performTask(){
        policy.apply(); // delegate policy apply to separate class
        this.contextualWOrk();
    }
}

public interface Policy{
    void apply();
}

public class PolicyX{
     public void apply(){
         //Policy X implementation
     }
}

public class PolicyY{
     public void apply(){
         //Policy Y implementation
     }
}

Теперь код использует вышеприведенный код

public class User{
    public void init(Context context){
         context.setPolicy(new PolicyX());
         context.performTask();
    }
}

Выше мы видим, что пользовательский код должен знать и предоставлять конкретную Политику в Контекст.Мы можем использовать Creational Pattern, как Factory method pattern, но все же в таком случае пользовательский код должен знать конкретный класс Factory.Для этого необходимо, чтобы пользовательский код создал и знал о существовании таких конкретных реализаций.

Чтобы предотвратить это, простое решение может иметь статический метод, принимающий входные данные в виде строки или перечисления и использующий операторы 'switch-case' или несколько операторов 'if-else', решающие, какой класс создать, и предоставить реализацию пользователюкод.Но, опять же, это нарушает «OCP», так как в случае добавления нового типа потребуется изменить код.

Как это можно сделать, чтобы следовать принципам в простом приложении (я не уверен, что может быть с некоторыми конфигурациями Spring и другие фреймворки решают такие проблемы).

Любые подсказки или ключевые моменты, чтобы решить эту проблемув простом приложении будет полезно.

1 Ответ

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

Этот недостаток шаблона стратегии упоминается на странице 318.

Клиенты должны знать о различных стратегиях .Шаблон имеет потенциальный недостаток в том, что клиент должен понимать, как отличаются стратегии, прежде чем он сможет выбрать подходящую.Клиенты могут столкнуться с проблемами внедрения.Поэтому вы должны использовать шаблон «Стратегия» только в том случае, если изменение в поведении имеет отношение к клиентам.

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

...