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 и другие фреймворки решают такие проблемы).
Любые подсказки или ключевые моменты, чтобы решить эту проблемув простом приложении будет полезно.