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