Strategia jest czynnościowym wzorcem obiektowym. Wzorzec składa się z wielu związanych ze sobą algorytmów ukrytych wewnątrz klasy sterującej zwanej Context. Program klienta może wybrać jeden z tych algorytmów lub najodpowiedniejszy z nich. Intencją wzorca jest wymienność algorytmów w trakcie działania programu oraz ich hermetyzacja. Bardzo łatwo dodaje się nowe algorytmy, poprzez utworzenie nowej klasy implementującej dany interfejs. Conext może w danej chwili mieć wybraną tylko jedną strategię.

Kiedy to może mieć zastosowanie:

  • naliczanie podatku w sklepie zależnie od kraju zamieszkania kupującego,
  • Kompresowanie plików z wykorzystaniem różnych algorymtów,
  • Zapisywanie plików w różnych formatach.

Przykład:

Codziennie jeżdżę do pracy samochodem, jednak w sobotę w ramach mojego udziału dla ochronoy środowiska naturalnego – samochód zostawiam w garażu i jadę metrem ( :D ). W niedzielę dla poprawienia kondycji poruszam sie tylko rowerem. Nie zmienia to faktu, że każdego dnia gdzieś się przemieszczam za pomocą środka transportu. Stwórzmy interfejs dla niego.

Jest to interfejs dla wszystkich naszych strategii: Metro, Rower i Samochód:

Strategie mamy napisane więc czas na Context – w naszym przypadku klasa Podróznik:

W naszym Contex’cie wybór strategii zależny jest od dnia tygodnia, ale nic nie stoi na przeszkodzie aby zastosować inny algorytm.
Bardzo często wzorzec Strategia można spotkać w połączeniu z jednym z wzorców fabrykujących, które zastępują Context.

Diagram wzorca strategia:


.