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.
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
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
0 Comments