Il pattern Decorator consente all’utente di aggiungere nuove funzionalità ad un oggetto esistente senza alterarne la struttura. Questo tipo di design pattern rientra nei pattern Strutturali, poiché funge da involucro per la classe esistente.

DECORATOR

Il pattern consiste una classe Decorator.java che avvolge la classe originale e fornisce funzionalità aggiuntive mantenendo intatta la firma dei metodi della classe.

DIAGRAMMA UML DECORATOR

UML

IMPLEMENTAZIONE DECORATOR

Creiamo un’interfaccia Figura e le classi concrete che la implementano. Dopo di che creaimo una classe decoratore astratta FiguraDecorator che implementa l’interfaccia Figura e che ha l’oggetto Figura come variabile di istanza. Infine creiamo la classe FiguraRossaDecorator che implementa FiguraDecorator.

Step 1: Creiamo l’interfaccia Figura

public interface Figura {
    void disegna();
}

Step 2: Creiamo le classi astratte che la implementano

Cerchio.java

public class Cerchio implements Figura {

    @Override
    public void disegna() {
        System.out.println("[CERCHIO]: disegna()");
    }
}

Rettangolo.java

public class Rettangolo implements Figura {

    @Override
    public void disegna() {
        System.out.println("[RETTANGOLO]: disegna()");
    }
}

Step 3: Creiamo la classe astratta FiguraDecorator

public abstract class FiguraDecorator implements Figura {
    protected Figura figuraDecorata;

    public FiguraDecorator(Figura figuraDecorata){
        this.figuraDecorata = figuraDecorata;
    }

    public void disegna(){
        figuraDecorata.disegna();
    }
}

Step 4: Creiamo la classe che estende la classe astratta

public class FiguraRossaDecorator extends FiguraDecorator {

    public FiguraRossaDecorator(Figura figuraDecorata) {
        super(figuraDecorata);
    }

    @Override
    public void disegna() {
        figuraDecorata.disegna();
        aggiungiBordiRossi(figuraDecorata);
    }

    private void aggiungiBordiRossi(Figura figuraDecorata){
        System.out.println("[FIGURAROSSADECORATOR]: Bordo Colore: Rosso");
    }
}

Step 5: Creiamo il main

public class Main {
    public static void main(String[] args) {

        Figura circle = new Cerchio();
        Figura redCircle = new FiguraRossaDecorator(new Cerchio());
        Figura redRectangle = new FiguraRossaDecorator(new Rettangolo());
        System.out.println("[MAIN]: Cerchio con bordi normali");
        circle.disegna();
        System.out.println("\n[MAIN]: Cerchio con bordi rossi");
        redCircle.disegna();
        System.out.println("\n[MAIN]: Rettangolo con bordi rossi");
        redRectangle.disegna();
    }
}

Step 6: Output

[MAIN]: Cerchio con bordi normali
[CERCHIO]: disegna()

[MAIN]: Cerchio con bordi rossi
[CERCHIO]: disegna()
[FIGURAROSSADECORATOR]: Bordo Colore: Rosso

[MAIN]: Rettangolo con bordi rossi
[RETTANGOLO]: disegna()
[FIGURAROSSADECORATOR]: Bordo Colore: Rosso

 

LINK UTILI