Следующий пример кода представляет собой реализацию шаблона стратегии , скопированного из Википедии . Мой полный вопрос следует за этим ...
Вики 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's 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's 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's 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);
}
Сводное обновление
Перечисление в точечной форме того, что было обнаружено посредством ответов и комментариев:
- Контекст позволяет варьировать способ использования составной стратегии (например, время ее вызова). Различные контексты могут выполнять различную внутреннюю работу до и после вызова данной стратегии.
- Контекстом является «черный ящик» высокого уровня. Может измениться логика контекста, также может измениться составная стратегия (или другая используемая), не нарушая клиента, потому что клиент понимает только то, как вызывать контекст.
- Даже несмотря на то, что я создал альтернативную реализацию примера кода Википедии, оставив контекст, и хотя он работал так же, как и оригинал, вся ситуация была упрощена (в обоих случаях) и мои изменения фактически означали: больше не шаблон стратегии, 2. Я скучаю по преимуществам духа шаблона стратегии, которые упомянуты здесь.
- Моя альтернативная реализация использовала основной метод, такой как Context, поэтому я мог бы также сохранить Context, если эффективно имитирую его. Создав шаблон нечистой Стратегии, возникла путаница. Мне не нужно было изобретать велосипед или пытаться быть умнее (в данном случае).
Если какие-либо другие пункты были бы полезны, или если это требует исправления, оставьте комментарий, и я изменю список соответствующим образом.