Strategy – wzorzec projektowy

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.

Tagi: Brak tagów

Add a Comment

Your email address will not be published. Required fields are marked *