Wzorzec strategii

Z Wikipedii

Skocz do: nawigacji, szukaj

Wzorzec strategii to w inżynierii oprogramowania jeden z wzorców projektowych należący do grupy wzorców operacyjnych. Jego istotą jest zapewnienie sposobu na elastyczne wybieranie algorytmu wykonania danej czynności w trakcie działania programu.

[edytuj] Problem

Przy projektowaniu architektury systemów informatycznych często natrafia się na miejsca, w których następuje potrzeba wybrania jednego z kilku sposobów wykonania jakiegoś cząstkowego zadania. Przykładowo:

  • aplikacja sklepu internetowego musi we właściwy sposób naliczyć podatek w zależności od kraju klienta
  • formularz zakładania konta musi w odpowiedni sposób (w zależności od typu oczekiwanych danych) zwalidować każde z pól
  • w zależności od polecenia użytkownika dane muszą być zaprezentowane jako strona WWW, dokument PDF lub obrazek PNG

[edytuj] Rozwiązanie

Schemat UML przykładowej realizacji wzorca strategii
Schemat UML przykładowej realizacji wzorca strategii

Najbardziej oczywistym sposobem rozwiązania tego problemu wydaje się zastosowanie którejś z instrukcji warunkowych wybierającej żądany algorytm. Jednak takie rozwiązanie jest mało elastyczne - zarówno warunki wyboru jak i lista algorytmów są trwale wpisane w program.

W językach obiektowych lepszym wyjściem jest hermetyzacja zmienności algorytmów przez zdefiniowanie bazowej klasy abstrakcyjnej, z której dziedziczą konkretne klasy implementujące poszczególne algorytmy. Obiekt wykorzystujący algorytm zawiera wtedy pole przechowujące instancję klasy konkretnej (lub wręcz ciąg znaków identyfikujący nazwę klasy konkretnej jeśli są one przechowywanymi w puli singletonami) i może dzięki polimorfizmowi wykonać go nie wiedząc zupełnie który konkretnie algorytm jest stosowany.

W razie, gdyby istniała potrzeba dodania nowego algorytmu, zastosowanie tego wzorca zapewnia możliwość łatwej rozbudowy programu bez konieczności zmieniania jego architektury. Należy po prostu dodać kod nowej klasy i przekazać jej instancję do obiektu wykorzystującego algorytm.