STRATEGIA
Wzorzec ten należy do grupy wzorców operacyjnych (z ang. behavioral). Innymi słowy takich, które zajmują się strukturą procesów, działań w szerszej perspektywie. Charakteryzuje się tym, że enkapsuluje proces. Dzieli go na mniejsze moduły, które zawierają w sobie elementy rozwiązania problemu. Strategia zarządza tymi modułami, pozwala stosować je zamiennie w zależności od kontekstu.
Ogromną zaletą tego wzorca jest elastyczność. Jeśli pojawi się nowa sytuacja do obsłużenia, nowy algorytm. Wystarczy dodać nową klasę i nałożyć na nią odpowiedni interfejs. Jest to więc stosunkowo bardzo mała praca.
Spróbujmy na przykładzie programu pralki automatycznej zrozumieć istotę tego wzorca.
Stwórzmy więc bazowy interfejs dla naszego programu:
public interface ListaZadan {
public void wykonajZadanie();
}
W następnej kolejności utworzymy klasy rzeczywiste potrzebne do obsługi naszego programu, które będą implementacjami naszego interfejsu:
public class NalewanieWody implements ListaZadan{
public void wykonajZadanie(){
System.out.println("Wlewam wode do bebna");
}
}
public class PodgrzanieWody implements ListaZadan{
public void wykonajZadanie(){
System.out.println("Podgrzewam do odpowiedniej temperatury");
}
}
public class CyklPraniaGlownego implements ListaZadan{
public void wykonajZadanie(){
System.out.println("Odbywa sie pranie zasadnicze");
}
}
public class Plukanie implements ListaZadan{
public void wykonajZadanie(){
System.out.println("Plukanie prania");
}
}
public class WirowanieWstepne implements ListaZadan{
public void wykonajZadanie(){
System.out.println("Wirowanie wstepne");
}
}
public class WirowanieKoncowe implements ListaZadan{
public void wykonajZadanie(){
System.out.println("Wirowanie koncowe");
}
}
Teraz oczywiście potrzebna nam będzie pralka do zrealizowania poszczególnych zadań:
public class Pralka {
ListaZadan zadanie;
public Pralka(ListaZadan noweZadanie){
zadanie = noweZadanie;
}
public void wykonaj(){
zadanie.wykonajZadanie();
}
public void przelaczZadanie(ListaZadan noweZadanie){
zadanie = noweZadanie;
}
}
Przetestujmy zatem następującą sekwencję zdarzeń:
public class Test {
public static void main(String[] args){
Pralka pranie = new Pralka(new NalewanieWody());
pranie.wykonaj();
pranie.przelaczZadanie(new PodgrzanieWody());
pranie.wykonaj();
pranie.przelaczZadanie(new CyklPraniaGlownego());
pranie.wykonaj();
pranie.przelaczZadanie(new Plukanie());
pranie.wykonaj();
pranie.przelaczZadanie(new WirowanieWstepne());
pranie.wykonaj();
pranie.przelaczZadanie(new Plukanie());
pranie.wykonaj();
pranie.przelaczZadanie(new WirowanieKoncowe());
pranie.wykonaj();
}
}
Poniżej wynik tych operacji:
Wlewam wode do bebna
Podgrzewam do odpowiedniej temperatury
Odbywa sie pranie zasadnicze
Plukanie prania
Wirowanie wstepne
Plukanie prania
Wirowanie koncowe
Podsumowanie
Mam nadzieję że przedstawienie powyższego przykładu pomoże Wam zrozumieć na czym polega wzorzec Strategia i jestem przekonany że bez problemu będziecie go w stanie wdrożyć kiedy przyjdzie taka potrzeba.