Учебники

Шаблоны дизайна — шаблон декоратора

Шаблон Decorator позволяет пользователю добавлять новые функциональные возможности к существующему объекту, не изменяя его структуру. Этот тип шаблона проектирования подпадает под структурный шаблон, поскольку этот шаблон действует как оболочка для существующего класса.

Этот шаблон создает класс декоратора, который оборачивает исходный класс и обеспечивает дополнительную функциональность, сохраняя сигнатуру методов класса без изменений.

Мы демонстрируем использование шаблона декоратора на следующем примере, в котором мы будем украшать форму некоторым цветом без изменения класса формы.

Реализация

Мы собираемся создать интерфейс Shape и конкретные классы, реализующие интерфейс Shape . Затем мы создадим абстрактный класс декоратора ShapeDecorator, реализующий интерфейс Shape и имеющий объект Shape в качестве переменной экземпляра.

RedShapeDecorator — это конкретный класс, реализующий ShapeDecorator .

DecoratorPatternDemo , наш демонстрационный класс будет использовать RedShapeDecorator для украшения объектов Shape .

UML Диаграмма Декоратора

Шаг 1

Создать интерфейс.

Shape.java

public interface Shape {
   void draw();
}

Шаг 2

Создайте конкретные классы, реализующие тот же интерфейс.

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

Шаг 3

Создайте абстрактный класс декоратора, реализующий интерфейс Shape .

ShapeDecorator.java

public abstract class ShapeDecorator implements Shape {
   protected Shape decoratedShape;

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

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

Шаг 4

Создайте класс декоратора бетона, расширяющий класс 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");
   }
}

Шаг 5

Используйте RedShapeDecorator для украшения объектов 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();
   }
}

Шаг 6

Проверьте вывод.