Strategy pattern definiše familiju algoritama, enkapsulira svaki i čini ih međusobno zamenjivim. Strategy omogućava da algoritam varira nezavisno od klijenta koji ga koriste.
Iako jednostavan za implementaciju, Strategy je jedan od važnijih paterna kojim se ostvaruje princip "programiranje interfejsa". Često se u procesu modelovanja nailazi na slučaj kada dinamički, za vreme izvršavanja, treba odlučiti na koji način (kojim algoritmom) treba ostvariti neku funkcionalnost nad istim ulaznim skupom parametara. Za ove algoritme se može reći da pripadaju istoj familiji, pošto se bave istim ulaznim podacima na različit način.
Najprimitivnije rešenje ovog problema je niz if i
else blokova, koji svaki za sebe implementira jedan
algoritam. Jasno je da ovako modeliran kod brzo postaje ogroman, nečitljiv
i težak za održavanje. Strategy patern rešava ovakvu vrstu problema. Algoritmi se
enkapsuliarju u zasebne entite, koji svi implementiraju zajednički
interfejs kojim im se pristupa.
Čest primer za Strategy patern je sortiranje: niz stringova
treba sortirati korišćenjem, na primer, Quick, Bubble ili Insertion Sort algoritmom.
Odlučivanje o tome koji se algoritam koristi se dešava za vreme izvršavanja, dinamčki.
Primenom Strategy paterna na ovaj problem prvo se izdvaja interfejs za
sortiranje, koji definiše kako se ulazni podaci prosleđuju algoritmu i šta je rezultat
obrade. Ovde takav interfejs, SortStrategy, može da, na primer, sadrži samo
jednu metodu: doSort(). Svaki pojedinačan algoritam implementira SortStrategy
interfejs i u doSort() implementira konkretan algoritam sortiranja.
Kao drugi primer Strategy paterna može da posluži poznati Javin LayoutManager
interfejs. Njime se definiše način komuniciranja sa konkretnim layout menadžerom, a
različite implementacije (FlowLayout, BorderLayout, ...) definišu
te konkretne načine menadžerisanja layouta.
Kao sledeći primer može da posluži validacija nekog ulaznog stringa. Postoje različiti vidovi
(algoritmi) validacije, zavisno od tipa ulaznog podatka. Tako, na primer, može da postoji
validacija da li se unet string sastoji samo od brojeva, da li predstavlja ispravnu e-mail adresu,
telefonski broj i tome slično. Ovde bi postojao ValidatorStrategy interfejs sa
jednom metodom, validate(), a različite implementacije interfejsa bi radile konkretnu
validaciju.
Kao što se vidi, Strategy patern se može primeniti na veliki broj problema. On je odlično
rešenje u slučajevima kada se više klasa slične namene razlikuju samo u ponašanju, kada
postoji potreba za različitim varijantama jednog algoritma ili kada klasa definiše više
ponašanja koja su organizovana u if blokovima. Treba još napomenuti
da se korišćenjem Strategy paterna povećava broj klasa u sistemu, kao i da konkretne realizacije
moraju da implementiraju odgovarajući Strategy interfejs.
Strategy patern je jako sličan Template Method paternu.
Strategy - interfejs za konkretne realizacije algoritmaConcreteStrategyA - jedna konkretna implementacija algoritmaClient - korisnik jednog algoritma kroz Strategy interejsDat je primer Strategy paterna koji se može downloadovati.