Przeznaczenie
Umożliwia zdefiniowanie rodziny algorytmów, umieszczenie ich w osobnych klasach oraz ich wymienne stosowanie. Pozwala to zmieniać sposób działania obiektu bez ingerencji w jego kod.
Dlaczego go potrzebujemy ?
- Eliminuje duplikację kodu i rozbudowane instrukcje warunkowe
- Ułatwia zmianę zachowania w czasie działania programu
- Izoluje zmieniające się części kodu
- Ułatwia testowanie i rozwój
Poniżej przykładowy kod przed użyciem wzorca Strategy:
public class Painter {
private String name;
public Painter(String name) {
this.name = name;
}
public void paint() {
System.out.println("Maluję kredkami");
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
public class Main {
public static void main(String[] args) {
Painter painter = new Painter("Jan Matejko");
painter.paint();
}
}
Strategy – schemat działania
Struktura:

Kod:
public interface Paint {
void paint();
}
public class CrayonPaint implements Paint {
@Override
public void paint() {
System.out.println("Maluje kredkami");
}
}
public class BrushPaint implements Paint {
@Override
public void paint() {
System.out.println("Maluje farbami");
}
}
public class Painter {
private String name;
private Paint picture;
public Painter(String name) {
this.name = name;
}
public void paint() {
this.picture.paint();
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Paint getPicture() {
return picture;
}
public void setPicture(Paint picture) {
this.picture = picture;
}
}
public class Main {
public static void main(String[] args) {
Painter painter = new Painter("Jan Matejko");
painter.setPicture(new BrushPaint());
painter.paint();
painter.setPicture(new CrayonPaint());
painter.paint();
}
}
Podsumowanie
Wzorzec Strategy:
- Pozwala definiować wiele algorytmów (strategii) i stosować je zamiennie bez modyfikowania klienta.
- Promuje zasadę kompozycji zamiast dziedziczenia.
- Ułatwia utrzymanie i rozwój kodu, eliminując złożone instrukcje warunkowe.
- Dobrze sprawdza się, gdy obiekty mogą zmieniać zachowanie w czasie działania programu.
