Шаблон Decorator позволяет пользователю добавлять новые функциональные возможности к существующему объекту, не изменяя его структуру. Этот тип шаблона проектирования подпадает под структурный шаблон, поскольку этот шаблон действует как оболочка для существующего класса.
Этот шаблон создает класс декоратора, который оборачивает исходный класс и обеспечивает дополнительную функциональность, сохраняя сигнатуру методов класса без изменений.
Мы демонстрируем использование шаблона декоратора на следующем примере, в котором мы будем украшать форму некоторым цветом без изменения класса формы.
Реализация
Мы собираемся создать интерфейс Shape и конкретные классы, реализующие интерфейс Shape . Затем мы создадим абстрактный класс декоратора ShapeDecorator, реализующий интерфейс Shape и имеющий объект Shape в качестве переменной экземпляра.
RedShapeDecorator — это конкретный класс, реализующий ShapeDecorator .
DecoratorPatternDemo , наш демонстрационный класс будет использовать RedShapeDecorator для украшения объектов Shape .
Шаг 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
Проверьте вывод.