Strategia jest to behawioralny wzorzec projektowy, który umożliwia wymianę algorytmów w trakcie działania aplikacji. Wzorzec ten definiuje rodzinę algorytmów, które mogą być wymieniane w trakcie działania programu bez wpływu na jego działanie. Dzięki temu podejściu wzorzec strategia pozwala na oddzielenie algorytmów od klas, które je wykorzystują, co ułatwia modyfikowanie i testowanie aplikacji.
Poniżej przykład implementacji wzorca strategia:
Interfejs wzorca strategia deklaruje metodę niezbędną do wykonania algorytmu
public interface Strategy {
public int execute(int a, int b);
}
Następie każda klasa implementuje interfejs z metodą execute().
public class OperationAdd implements Strategy {
public int execute(int a, int b) {
return a + b;
}
}
public class OperationSubstract implements Strategy {
public int execute(int a, int b) {
return a - b;
}
}
public class OperationMultiply implements Strategy {
public int execute(int a, int b) {
return a * b;
}
}
Klasa Context – współpracuje ze wszystkimi strategiami za pośrednictwem interfejsu.
public class Context {
private Strategy strategy;
public Context(Strategy strategy){
this.strategy = strategy;
}
public int executeStrategy(int a, int b){
return strategy.execute(a, b);
}
}
Tworzenie obiektów i wywołanie metod:
public static void main(String[] args) {
Context context = new Context(new OperationAdd());
System.out.println("10 + 5 = " + context.executeStrategy(10, 5));
context = new Context(new OperationSubstract());
System.out.println("10 - 5 = " + context.executeStrategy(10, 5));
context = new Context(new OperationMultiply());
System.out.println("10 * 5 = " + context.executeStrategy(10, 5));
}
Poszczególne algorytmy wykonują podobne zadania, ale w różnych wariantach umieszczane są w odrębnych klasach. Każda z tych klas tworzy osobną strategię. Następnie klasa zwana kontekstem deleguje pracę obiektowi typu strategia w odpowiedzi na żądanie klienta. Kontekst współpracuje ze wszystkimi strategiami za pośrednictwem interfejsu, który jest wspólnych dla wszystkich strategii. Interfejs deklaruje metodę za pomocą której kontekst uruchamia algorytm w danej strategii.
Wzorzec strategia umożliwia odizolowanie części algorytmów odpowiedzialnych za zachowania bądź wybór odpowiedniego wariantu od pozostałego kodu. Stosowany jest także gdy program zawiera wiele podobnych klas różniących się między sobą jedynie wykonaniem zadania.