Имеет ли этот шаблон стратегии Java избыточный класс Context?

Следующий пример кода представляет собой реализацию шаблона стратегиископировано из Википедии, Мой полный вопрос следует за этим ...

Вики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);

}
Краткое обновление

Перечисление в точечной форме, что было обнаружено с помощью ответов и комментариев:

Контекст позволяет варьировать то, как используется составная стратегия (например, ее время).зов). Различные контексты могут выполнять различную внутреннюю работу до и после вызова данной Стратегии.Контекст высокого уровня "черный ящик", Может измениться логика контекста, также может измениться составная стратегия (или другая используемая), не нарушая клиента, потому что клиент понимает только то, как вызывать контекст.Несмотря на то, что я создал альтернативную реализацию примера кода Википедии, оставив контекст, и хотя он работал так же, как и оригинал, вся ситуация была упрощена (в обоих случаях), и мои изменения фактически означали: 1. это 'больше не шаблон стратегии, 2. Я скучаю по преимуществам духа шаблона стратегии, которые упомянуты здесь.Моя альтернативная реализация использовала основной метод, такой как Context, поэтому я мог бы также сохранить Context, если эффективно имитирую его. Создав шаблон нечистой Стратегии, возникла путаница. Я не'Не нужно изобретать велосипед или пытаться быть умнее (в этом случае).

Если какие-либо другие пункты были бы полезны или если это нуждается в исправлении, оставьте комментарий, и я 'доработаю список соответственно.

Ответы на вопрос(4)

Ваш ответ на вопрос