Programowanie obiektowe w dużej mierze opiera się na wzorcach projektowych. Często nie zdajemy sobie nawet sprawy, że dany sposób postępowania czy rozwiązanie problemu nosi nazwę takiego wzorca projektowego.
Strategia to czynnościowy wzorzec projektowy, który hermetyzuje algorytmy z danej rodziny w postaci klas. Jeśli taka definicja brzmi skomplikowanie to diagram UML wyjaśnię wszelkie wątpliwości.
Często okazuje się, że dziedziczenie jest niewystarczającym sposobem tworzenia oprogramowania. Wtedy z pomocy przychodzi inne techniki projektowania aplikacji.
Strategia definiuje wspólny interfejs dla każdego obsługiwanego algorytmu. Wymusza to na nas stworzenie implementacji obsługiwanych funkcji w klasach dostarczających konkretne algorytmy. Klasa, która korzysta z tych algorytmów, ustawia referencję do aktualnie używanej strategii poprzez metodę ustawStrategie()
. Jeśli klient zmienia algorytm danej strategii, wiąże się to z ustawieniem nowej strategii dla klienta. Analogicznie tworzenie następnych algorytmów nie wymaga ingerencji w klasy klienta, ani interfejsu, a jedynie stworzenia nowej strategii implementującej znany interfejs.
Wzorzec strategii opiera swoje działanie na kompozycji i delegacji, a nie dziedziczeniu. Dzięki temu unikamy mało elastycznych instrukcji warunkowych w klasie klienta, który wybiera dany algorytm. Poszczególne strategie mogą być zmieniane w trakcie działania programu, co daje korzyści w postaci różnego zużycia zasobów lub złożoności obliczeniowej. Takie rozwiązanie ma też swoje wady w postaci narzutu komunikacji między klientem i strategią, a także większą liczę utworzonych obiektów. Jednak moim zdaniem to mały koszt w stosunku do przytoczonych zalet.
Przykładowe wykorzystanie tego wzorca w PHP opiszę szerzej w artykule dotyczącym wsparcia generowania tabel XHTML.
W odpowiedzi na “Wzorzec projektowy Strategia”
Szybko i konkretnie wytłumaczone.
Jeśli się nie pogniewasz to na http://javadeveloper.pl/wzorzec-projektowy-strategia można zobaczyć jak wygląda implementacja w języku java