DECORATOR PATTERN: UN PICCOLO ESEMPIO IN JAVA
Il pattern Decorator è un pattern di design strutturale che consente di aggiungere comportamenti dinamicamente a un oggetto esistente, senza doverlo modificare direttamente. Esso consente, quindi, di aggiungere funzionalità a un oggetto in modo flessibile, senza dover creare classi sottostanti per ogni combinazione di funzionalità aggiuntive.
Il Decorator pattern prevede l'uso di classi wrapper che estendono la funzionalità di un oggetto base, senza modificare il comportamento originale dell'oggetto. Le classi wrapper sono incapsulate all'interno di altre classi wrapper, formando una gerarchia di classi decorator. Ogni classe wrapper decoratore aggiunge funzionalità al decoratore precedente, fino a raggiungere l'oggetto base.
Ecco un esempio di codice Java che illustra il suo funzionamento:
// Definizione dell'interfaccia Shape
public interface Shape {
void draw();
}
// Implementazione della classe concreta Circle
public class Circle implements Shape {
@Override
public void draw() {
System.out.println("Disegno un cerchio.");
}
}
// Implementazione della classe concreta Rectangle
public class Rectangle implements Shape {
@Override
public void draw() {
System.out.println("Disegno un rettangolo.");
}
}
// Implementazione della classe astratta ShapeDecorator
public abstract class ShapeDecorator implements Shape {
protected Shape decoratedShape;
public ShapeDecorator(Shape decoratedShape) {
this.decoratedShape = decoratedShape;
}
public void draw() {
decoratedShape.draw();
}
}
// Implementazione della classe concreta RedShapeDecorator
public class RedShapeDecorator extends ShapeDecorator {
public RedShapeDecorator(Shape decoratedShape) {
super(decoratedShape);
}
@Override
public void draw() {
decoratedShape.draw();
setRedBorder(decoratedShape);
}
private void setRedBorder(Shape decoratedShape) {
System.out.println("Bordo rosso.");
}
}
// Uso del Decorator pattern
public class DecoratorPatternDemo {
public static void main(String[] args) {
Shape circle = new Circle();
// Applicazione del decoratore
Shape redCircle = new RedShapeDecorator(new Circle());
Shape redRectangle = new RedShapeDecorator(new Rectangle());
System.out.println("Cerchio con bordo normale");
circle.draw();
System.out.println("\nCerchio con bordo rosso");
redCircle.draw();
System.out.println("\nRettangolo con bordo rosso");
redRectangle.draw();
}
}
In questo esempio, l'interfaccia Shape
definisce un metodo draw()
che viene implementato dalle classi concrete Circle
e Rectangle
. La classe astratta ShapeDecorator
implementa l'interfaccia Shape
e contiene un oggetto decoratedShape
di tipo Shape
come campo dati. La classe concreta RedShapeDecorator
estende la classe ShapeDecorator
e aggiunge funzionalità al metodo draw()
aggiungendo un bordo rosso al disegno.
Nel metodo main()
, viene creato un oggetto Circle
e due oggetti RedShapeDecorator
, uno per il cerchio e uno per il rettangolo. I decoratori sono applicati agli oggetti Circle
e Rectangle
.
Comments
Post a Comment