Kody źródłowe/Dekorator (wzorzec projektowy)
Wygląd
Java
[edytuj]// interfejs Okno
interface Okno {
public void rysuj(); // rysuje Okno na ekranie
public String pobierzOpis(); // zwraca opis Okna
}
// implementacja zwykłego okna bez pasków przewijania
class ZwykłeOkno implements Okno {
public void rysuj() {
// rysuj okno
}
public String pobierzOpis() {
return "zwykłe okno";
}
}
Poniższe klasy zawierają dekoratory dla wszystkich klas Okno, w tym też dla klas dekoratorów.
// abstrakcyjna klasa dekorator - implementuje interfejs Okno
abstract class OknoDekorator implements Okno {
protected Okno dekorowaneOkno; // dekorowane Okno
public OknoDekorator(Okno dekorowaneOkno) {
this.dekorowaneOkno = dekorowaneOkno;
}
}
// pierwszy dekorator dodający pionowe paski przewijania
class PionowePrzewijanieDekorator extends OknoDekorator {
public PionowePrzewijanieDekorator (Okno dekorowaneOkno) {
super(dekorowaneOkno);
}
public void rysuj() {
rysujPionowyPasekPrzewijania();
dekorowaneOkno.rysuj();
}
private void rysujPionowyPasekPrzewijania() {
// rysuj pionowy pasek przewijania
}
public String pobierzOpis() {
return dekorowaneOkno.pobierzOpis() + ", z pionowym paskiem przewijania";
}
}
// drugi dekorator dodający poziome paski przewijania
class PoziomePrzewijanieDekorator extends OknoDekorator {
public PoziomePrzewijanieDekorator (Okno dekorowaneOkno) {
super(dekorowaneOkno);
}
public void rysuj() {
rysujPoziomyPasekPrzewijania();
dekorowaneOkno.rysuj();
}
private void rysujPoziomyPasekPrzewijania() {
// rysuj poziomy pasek przewijania
}
public String pobierzOpis() {
return dekorowaneOkno.pobierzOpis() + ", z poziomym paskiem przewijania";
}
}
Program testowy, który tworzy obiekt klasy Okno, dekoruje go poziomymi i pionowymi paskami przewijania i wypisuje jego opis.
public class DekorowaneOknoTest {
public static void main(String[] args) {
// utwórz dekorowane Okno z poziomymi i pionowymi paskami przewijania
Okno dekorowaneOkno = new PoziomePrzewijanieDekorator(
new PionowePrzewijanieDekorator(new ZwykłeOkno()));
// wypisz opis Okna
System.out.println(dekorowaneOkno.pobierzOpis());
}
}