Wzorce projektowe - wzorzec dekoratora

Wzorzec dekoratora umożliwia użytkownikowi dodanie nowej funkcjonalności do istniejącego obiektu bez zmiany jego struktury. Ten typ wzorca projektowego jest objęty wzorcem strukturalnym, ponieważ ten wzorzec działa jak opakowanie dla istniejącej klasy.

Ten wzorzec tworzy klasę dekoratora, która otacza oryginalną klasę i zapewnia dodatkową funkcjonalność, zachowując nienaruszoną sygnaturę metod klas.

Przedstawiamy użycie wzoru dekoratora na poniższym przykładzie, w którym ozdobimy kształt jakimś kolorem bez zmiany klasy kształtu.

Realizacja

Zamierzamy stworzyć interfejs Shape i konkretne klasy implementujące interfejs Shape . Następnie utworzymy abstrakcyjną klasę dekoratora ShapeDecorator implementującą interfejs Shape i mającą obiekt Shape jako zmienną instancji.

RedShapeDecorator jest klasą betonu implementującą ShapeDecorator .

DecoratorPatternDemo , nasza klasa demonstracyjna będzie używać RedShapeDecorator do ozdabiania obiektów Shape .

Krok 1

Utwórz interfejs.

Shape.java

public interface Shape {
   void draw();
}

Krok 2

Utwórz konkretne klasy implementujące ten sam interfejs.

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

Krok 3

Utwórz abstrakcyjną klasę dekoratora implementującą interfejs Shape .

ShapeDecorator.java

public abstract class ShapeDecorator implements Shape {
   protected Shape decoratedShape;

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

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

Krok 4

Utwórz klasę dekoratora betonu rozszerzającą klasę 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");
   }
}

Krok 5

Użyj RedShapeDecorator, aby ozdobić obiekty 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();
   }
}

Krok 6

Sprawdź dane wyjściowe.

Circle with normal border
Shape: Circle

Circle of red border
Shape: Circle
Border Color: Red

Rectangle of red border
Shape: Rectangle
Border Color: Red