Câu hỏi phỏng vấn Design pattern
Câu hỏi

Design Pattern Decorator là gì?

Câu trả lời

Thuộc nhóm structural design pattern cho phép người dùng thêm tính năng vào đối tượng đã tồn tại mà không phải chỉnh sửa cấu trúc của nó. Pattern này tạo một lớp gọi là decorator hành động như một wrapper, bọc đối tượng đã tồn tại bằng cách giữ nguyên đặc trưng của các phương thức lớp. Pattern này sử dụng lớp trừu tượng và itnerface với composition để triển khai wrapper. Chúng chủ yếu được sử dụng để áp dụng SRP (Nguyên tắc Trách nhiệm Đơn lẻ) khi ya phân chia các chức năng thành các lớp với các mối quan tâm duy nhất. Pattern này có cấu trúc tương tự như CoR ở trên. Các bước triển khai decorator:

  • Tạo một interface và lớp cụ thể triển khai interface này.
  • Tạo lớp trừu tượng decorator để triển khai interface trên.
  • Tạo lớp decorator cụ thể mở rộng từ lớp trừu tượng ở trên.
  • Sử dụng lớp decorator cụ thể để thêm tính năng cho đối tượng interface và xác minh kết quả.

Ta làm thử ví dụ để dễ hiểu. Ở đây ta tạo interface Shape và các lớp cụ thể của nó RectangleTriangle để triển khai interface này. Ta sẽ tạo lớp trừu tượng là ShapeDecorator để triển khai interface Shape. Sau đó ta tạo RedColorDecorator mở rộng từ ShapeDecorator. Ta sẽ sử dụng decorator này cho các triển khai tính năng.

Design Pattern Decorator là gì?
  • Tạo interface Shape:
java Copy
// Shape.java
public interface Shape {
    void draw();
}
  • Tạo lớp cụ thể Rectangle và Triangle để triển khai interface trên
java Copy
// Rectangle.java
public class Rectangle implements Shape {
    // Overriding the draw method
    @Override public void draw()
    {
        System.out.println("Rectangle Drawn...");
    }
}
java Copy
// Triangle.java
public class Triangle implements Shape {
    // Overriding the draw method
    @Override public void draw()
    {
        System.out.println("Triangle Drawn...");
    }
}
  • Tạo lớp trừu tượng ShapeDecorator triển khai interface Shape:
java Copy
// ShapeDecorator.java
public abstract class ShapeDecorator implements Shape {
    protected Shape shapeDecorated;
    public ShapeDecorator(Shape shapeDecorated)
    {
        this.shapeDecorated = shapeDecorated;
    }
    public void draw() { 
        shapeDecorated.draw(); 
    }
}
  • Tạo RedColorDecorator mở rộng rừ lớp ShapeDecorator:
java Copy
// RedColorDecorator.java
public class RedColorDecorator extends ShapeDecorator {
    public RedColorDecorator(Shape shapeDecorated)
    {
        super(shapeDecorated);
    }
    @Override 
    public void draw()
    {
        shapeDecorated.draw();
        setRedBorder(shapeDecorated);
    }
    private void setRedBorder(Shape shapeDecorated)
    {
        System.out.println("Red color border added...");
    }
}
  • Triển khai lớp Driver cho demo:
java Copy
// Driver.java
public class Driver {
    // Main driver method
    public static void main(String[] args)
    {
    
        Shape triangle = new Triangle();
        Shape redTriangle
            = new RedColorDecorator(new Triangle());
        Shape redRectangle = new RedColorDecorator(new Rectangle());
        // Draw normal triangle
        triangle.draw();
        System.out.println(".........");
        // make the triangle red
        redTriangle.draw();
        System.out.println(".........");
        // make the rectangle red
        redRectangle.draw();
        System.out.println(".........");
    }
}

Xác minh kết quả ở output:

text Copy
  Triangle Drawn...
   .........
   Triangle Drawn...
   Red color border added...
   .........
   Rectangle Drawn...
   Red color border added...
   .........
middle

middle

Gợi ý câu hỏi phỏng vấn

senior

Chain of Responsibility là gì? Trong trường hợp nào thì áp dụng pattern này?

middle

Design patterndesign principles khác nhau như thế nào?

middle

Design pattern nào trong thư viện JDK của Java?

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào