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