Czy ten wzorzec strategii Java ma nadmiarową klasę kontekstową?

Poniższy przykładowy kod stanowi implementację wzorca strategiiskopiowany z Wikipedii. Moje pełne pytanie wynika z tego ...

Wikimain metoda:

//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);

    }

}

Kawałki wzoru:

// 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);
    }

}

Biorąc pod uwagę powyższy przykład, jestContext klasa zbędna?

Na przykład mogę wymyślić następującą alternatywęmain implementacja przy użyciu istniejących klas i interfejsu z wyjątkiem kontekstu i będzie działać dokładnie tak samo. Jest nadal luźno powiązany.

((Edytować: W tym prostym scenariuszu, gdy pomijam klasę Kontekst,czy popełnię błąd w przyszłości? ))

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);

}
Aktualizacja podsumowująca

Wymienienie w formie punktu, co zostało odkryte poprzez odpowiedzi i komentarze:

Kontekst pozwala na zmianę sposobu stosowania złożonej strategii (np. Czas jej wywołania). Różne konteksty mogą wykonywać różne prace wewnętrzne przed i po wywołaniu danej strategii.Kontekstem jest „czarna skrzynka” wysokiego poziomu. Logika kontekstu może się zmienić, również złożona strategia może się zmienić (lub inna używana) bez zrywania klienta, ponieważ klient rozumie tylko, jak wywołać kontekst.Mimo że stworzyłem alternatywną implementację przykładowego kodu Wikipedii przez pominięcie kontekstu i chociaż działał on tak samo jak oryginał, cała sytuacja została uproszczona (w obu przypadkach), a moje zmiany w rzeczywistości oznaczały: 1. to nie jest strategia wzorzec już więcej, 2. Tęsknię za korzyściami ducha wzorca strategii, o którym tu mowa.Moja alternatywna implementacja korzystała z głównej metody, takiej jak kontekst, więc równie dobrze mógłbym zachować kontekst, jeśli byłaby to skuteczna symulacja. Tworząc nieczysty wzór strategii, powstało zamieszanie. Nie musiałem wymyślać na nowo koła ani starać się być mądrzejszym (w tym przypadku).

Jeśli jakiekolwiek inne punkty byłyby użyteczne lub gdyby wymagało to korekty, zostaw komentarz, a ja odpowiednio zmodyfikuję listę.

questionAnswers(4)

yourAnswerToTheQuestion