Modèles de conception - Modèle de décorateur

Le modèle Decorator permet à un utilisateur d'ajouter de nouvelles fonctionnalités à un objet existant sans modifier sa structure. Ce type de modèle de conception relève d'un modèle structurel car ce modèle agit comme un wrapper pour la classe existante.

Ce modèle crée une classe de décorateur qui encapsule la classe d'origine et fournit des fonctionnalités supplémentaires en préservant la signature des méthodes de classe.

Nous démontrons l'utilisation du motif décorateur via l'exemple suivant dans lequel nous décorerons une forme avec une certaine couleur sans modifier la classe de forme.

la mise en oeuvre

Nous allons créer une interface Shape et des classes concrètes implémentant l' interface Shape . Nous allons ensuite créer une classe de décorateur abstraite ShapeDecorator implémentant l' interface Shape et ayant l' objet Shape comme variable d'instance.

RedShapeDecorator est une classe concrète implémentant ShapeDecorator .

DecoratorPatternDemo , notre classe de démonstration utilisera RedShapeDecorator pour décorer les objets Shape .

Étape 1

Créez une interface.

Shape.java

public interface Shape {
   void draw();
}

Étape 2

Créez des classes concrètes mettant en œuvre la même interface.

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");
   }
}

Étape 3

Créez une classe de décorateur abstraite implémentant l' interface Shape .

ShapeDecorator.java

public abstract class ShapeDecorator implements Shape {
   protected Shape decoratedShape;

   public ShapeDecorator(Shape decoratedShape){
      this.decoratedShape = decoratedShape;
   }

   public void draw(){
      decoratedShape.draw();
   }	
}

Étape 4

Créez une classe de décorateur en béton étendant 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");
   }
}

Étape 5

Utilisez RedShapeDecorator pour décorer les objets Shape .

DécorateurPatternDemo.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();
   }
}

Étape 6

Vérifiez la sortie.

Circle with normal border
Shape: Circle

Circle of red border
Shape: Circle
Border Color: Red

Rectangle of red border
Shape: Rectangle
Border Color: Red