Mẫu thiết kế - Mẫu trang trí

Mẫu trang trí cho phép người dùng thêm chức năng mới vào một đối tượng hiện có mà không làm thay đổi cấu trúc của nó. Loại mẫu thiết kế này nằm dưới mẫu cấu trúc vì mẫu này hoạt động như một lớp bao bọc cho lớp hiện có.

Mẫu này tạo ra một lớp decorator bao bọc lớp ban đầu và cung cấp chức năng bổ sung giữ nguyên chữ ký của các phương thức lớp.

Chúng tôi đang chứng minh việc sử dụng mẫu trang trí thông qua ví dụ sau, trong đó chúng tôi sẽ trang trí một hình dạng với một số màu mà không làm thay đổi lớp hình dạng.

Thực hiện

Chúng ta sẽ tạo một giao diện Shape và các lớp cụ thể triển khai giao diện Shape . Sau đó, chúng ta sẽ tạo một lớp trang trí trừu tượng ShapeDecorator triển khai giao diện Shape và có đối tượng Shape làm biến thể hiện của nó.

RedShapeDecorator là lớp cụ thể triển khai ShapeDecorator .

DecoratorPatternDemo , lớp demo của chúng ta sẽ sử dụng RedShapeDecorator để trang trí các đối tượng Shape .

Bước 1

Tạo giao diện.

Shape.java

public interface Shape {
   void draw();
}

Bước 2

Tạo các lớp cụ thể triển khai cùng một giao diện.

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

Bước 3

Tạo lớp trang trí trừu tượng triển khai giao diện Shape .

ShapeDecorator.java

public abstract class ShapeDecorator implements Shape {
   protected Shape decoratedShape;

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

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

Bước 4

Tạo lớp trang trí bê tông mở rộng lớp 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");
   }
}

Bước 5

Sử dụng RedShapeDecorator để trang trí các đối tượng 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();
   }
}

Bước 6

Xác minh kết quả đầu ra.

Circle with normal border
Shape: Circle

Circle of red border
Shape: Circle
Border Color: Red

Rectangle of red border
Shape: Rectangle
Border Color: Red