Kody źródłowe/Dekorator (wzorzec projektowy)

Z Wikibooks, biblioteki wolnych podręczników.
Przejdź do nawigacji Przejdź do wyszukiwania
Dekorator (wzorzec projektowy)
Kod źródłowy
Kody źródłowe programów stosujących wzorzec projektowy dekoratora
Wikipedia
Zobacz w Wikipedii hasło Dekorator

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());
    }
}