Design Patterns - Decorator Pattern
Il motivo Decorator consente a un utente di aggiungere nuove funzionalità a un oggetto esistente senza alterarne la struttura. Questo tipo di modello di progettazione rientra nel modello strutturale poiché questo modello funge da involucro per la classe esistente.
Questo modello crea una classe decoratore che avvolge la classe originale e fornisce funzionalità aggiuntive mantenendo intatta la firma dei metodi di classe.
Stiamo dimostrando l'uso del motivo decorativo tramite il seguente esempio in cui decoreremo una forma con un po 'di colore senza alterare la classe della forma.
Implementazione
Creeremo un'interfaccia Shape e classi concrete che implementano l' interfaccia Shape . Creeremo quindi una classe di decoratore astratta ShapeDecorator che implementa l' interfaccia Shape e ha l' oggetto Shape come variabile di istanza.
RedShapeDecorator è una classe concreta che implementa ShapeDecorator .
DecoratorPatternDemo , la nostra classe demo utilizzerà RedShapeDecorator per decorare gli oggetti Shape .
Passo 1
Crea un'interfaccia.
Shape.java
public interface Shape {
void draw();
}
Passo 2
Crea classi concrete che implementano la stessa interfaccia.
Rectangle.java
public class Rectangle implements Shape {
@Override
public void draw() {
System.out.println("Shape: Rectangle");
}
}
Circle.java
public class Circle implements Shape {
@Override
public void draw() {
System.out.println("Shape: Circle");
}
}
Passaggio 3
Crea una classe decoratore astratta che implementa l' interfaccia Shape .
ShapeDecorator.java
public abstract class ShapeDecorator implements Shape {
protected Shape decoratedShape;
public ShapeDecorator(Shape decoratedShape){
this.decoratedShape = decoratedShape;
}
public void draw(){
decoratedShape.draw();
}
}
Passaggio 4
Crea una classe decoratore in cemento estendendo la classe ShapeDecorator .
RedShapeDecorator.java
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("Border Color: Red");
}
}
Passaggio 5
Usa il RedShapeDecorator per decorare gli oggetti Shape .
DecoratorPatternDemo.java
public class DecoratorPatternDemo {
public static void main(String[] args) {
Shape circle = new Circle();
Shape redCircle = new RedShapeDecorator(new Circle());
Shape redRectangle = new RedShapeDecorator(new Rectangle());
System.out.println("Circle with normal border");
circle.draw();
System.out.println("\nCircle of red border");
redCircle.draw();
System.out.println("\nRectangle of red border");
redRectangle.draw();
}
}
Passaggio 6
Verifica l'output.
Circle with normal border
Shape: Circle
Circle of red border
Shape: Circle
Border Color: Red
Rectangle of red border
Shape: Rectangle
Border Color: Red