Следующий пример кода - это реализация шаблона стратегии скопированного из Википедии. Мой полный вопрос следует за ним...
Метод Wiki main
:
//StrategyExample test application
class StrategyExample {
public static void main(String[] args) {
Context context;
// Three contexts following different strategies
context = new Context(new ConcreteStrategyAdd());
int resultA = context.executeStrategy(3,4);
context = new Context(new ConcreteStrategySubtract());
int resultB = context.executeStrategy(3,4);
context = new Context(new ConcreteStrategyMultiply());
int resultC = context.executeStrategy(3,4);
}
}
Узоры:
// The classes that implement a concrete strategy should implement this
// The context class uses this to call the concrete strategy
interface Strategy {
int execute(int a, int b);
}
// Implements the algorithm using the strategy interface
class ConcreteStrategyAdd implements Strategy {
public int execute(int a, int b) {
System.out.println("Called ConcreteStrategyA execute()");
return a + b; // Do an addition with a and b
}
}
class ConcreteStrategySubtract implements Strategy {
public int execute(int a, int b) {
System.out.println("Called ConcreteStrategyB execute()");
return a - b; // Do a subtraction with a and b
}
}
class ConcreteStrategyMultiply implements Strategy {
public int execute(int a, int b) {
System.out.println("Called ConcreteStrategyC execute()");
return a * b; // Do a multiplication with a and b
}
}
// Configured with a ConcreteStrategy object and maintains a reference to a Strategy object
class Context {
private Strategy strategy;
// Constructor
public Context(Strategy strategy) {
this.strategy = strategy;
}
public int executeStrategy(int a, int b) {
return strategy.execute(a, b);
}
}
В частности, приведенный выше пример является избыточным классом Context
?
Например, я могу придумать следующую альтернативную реализацию main
, используя существующие классы и интерфейс, кроме Context, и будет работать точно так же. Он все еще слабо связан.
((Изменить:) В этом простом сценарии, когда я оставляю класс Context, , я буду совершать будущую ошибку?))
public static void main(String[] args) {
IStrategy strategy;
// Three strategies
strategy = new ConcreteStrategyAdd();
int resultA = strategy.executeStrategy(3,4);
strategy = new ConcreteStrategySubtract();
int resultB = strategy.executeStrategy(3,4);
strategy = new ConcreteStrategyMultiply();
int resultC = strategy.executeStrategy(3,4);
}
Сводное обновление
Перечисление в форме точки, что было обнаружено с помощью ответов и комментариев:
- Контекст позволяет изменять то, как используется композитная стратегия (например, время ее вызова). Различные Контексты могут выполнять разные внутренние работы до и после вызова данной Стратегии.
- Контекст - это "черный ящик" высокого уровня. Логика Контекста может измениться, также составная Стратегия может измениться (или использоваться другой), не нарушая клиента, потому что клиент понимает только, как вызвать контекст.
- Несмотря на то, что я создал альтернативную реализацию кода примера Wikipedia, оставив контекст, и хотя он работал так же, как и исходный, вся ситуация была упрощена (в обоих случаях), и мои изменения на самом деле означали: 1. it а не шаблон стратегии, 2. Я скучаю по преимуществам духа шаблона стратегии, который упоминается здесь.
- В моей альтернативной реализации использовался основной метод, такой как Контекст, поэтому я мог бы также сохранить контекст, если эффективно имитировать его. Создав нечистую стратегический шаблон, возникла путаница. Мне не нужно было изобретать колесо или пытаться быть умнее (в данном случае).
Если какие-либо другие моменты будут полезны или если это потребует коррекции, оставляйте комментарий, и я соответственно изменю список.