JavaSvet - otvorena java zajednica

 
glavna stranica arr2javasvet  english version arr2java.net

Strategy Pattern

Igor Spasić
3 Okt 2004

Definicija

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.

Opis

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.

UML dijagram

Učesnici

  • Strategy - interfejs za konkretne realizacije algoritma
  • ConcreteStrategyA - jedna konkretna implementacija algoritma
  • Client - korisnik jednog algoritma kroz Strategy interejs
  • Primer

    Dat je primer Strategy paterna koji se može downloadovati.