Tiếp theo phần 1, chúng ta hãy cùng cafedev làm demo về decorator pattern nhằm giúp ace dễ hiểu khi áp dụng trên các ngôn ngữ khác nhau. Ace có thể tham khảo thêm các bài khác tại series Design Pattern tại đây.

Như chúng ta đã thấy các pattern trước đây của mình sử dụng tính năng thừa kế không hoạt động tốt như vậy. Trong bài viết này, decorator pattern được thảo luận cho vấn đề thiết kế trong phần trước.

Vì vậy, những gì chúng ta làm bây giờ là lấy một chiếc bánh pizza và “decorator” nó bằng các lớp phủ trong thời gian chạy:

  1. Lấy một đối tượng pizza.
  1. “Trang trí(decorator)” nó với một đối tượng Capsicum.
  1. “Trang trí(decorator)” nó bằng một đối tượng CheeseBurst.
  1. Gọi getCost() và sử dụng ủy quyền thay vì kế thừa để tính toán chi phí lớp trên.

Những gì chúng ta nhận được cuối cùng là một chiếc bánh pizza với lớp phủ phô mai và ớt chuông. Hình dung các đối tượng “decorator” giống như trình bao bọc. Dưới đây là một số thuộc tính của decorator:

  • Người trang trí(decorator) có cùng kiểu với đồ vật mà họ trang trí.
  • Bạn có thể sử dụng nhiều trình trang trí để bọc một đối tượng.
  • Vì trình trang trí có cùng loại với đối tượng, chúng ta có thể chuyển xung quanh đối tượng được trang trí thay vì chuyển sang nguyên bản.
  • Chúng ta có thể trang trí các đối tượng trong thời gian chạy.

1. Định nghĩa:

Decorator pattern có trách nhiệm bổ sung vào một đối tượng một cách hoạt động. Decorator cung cấp một giải pháp thay thế linh hoạt cho phân lớp con để mở rộng chức năng.

Sơ đồ lớp:

  • Mỗi thành phần có thể được sử dụng riêng hoặc có thể được bọc bởi người trang trí.
  • Mỗi trình trang trí có một biến thể hiện chứa tham chiếu đến thành phần mà nó trang trí (mối quan hệ HAS-A).
  • ConcreteComponent là đối tượng chúng ta sẽ trang trí động.

2. Ưu điểm:

  • decorator pattern có thể được sử dụng để có thể mở rộng (trang trí) chức năng của một đối tượng nhất định trong thời gian chạy .
  • Decorator pattern là một giải pháp thay thế cho phân lớp. Lớp con thêm hành vi tại thời điểm biên dịch và thay đổi ảnh hưởng đến tất cả các trường hợp của lớp gốc, Decoratorcó thể cung cấp hành vi mới trong thời gian chạy cho các đối tượng riêng lẻ.
  • Decorator cung cấp cách tiếp cận trả tiền khi bạn sử dụng để tăng thêm trách nhiệm. Thay vì cố gắng hỗ trợ tất cả các tính năng có thể thấy trước trong một lớp phức tạp, có thể tùy chỉnh, bạn có thể xác định một lớp đơn giản và thêm chức năng tăng dần với các đối tượng Decorator.

3. Nhược điểm:

  • Trình trang trí(Decorator) có thể làm phức tạp quá trình khởi tạo thành phần bởi vì bạn không chỉ phải khởi tạo thành phần mà còn phải bọc nó trong một số trình trang trí.
  • Có thể phức tạp để người trang trí(Decorator) theo dõi những người trang trí khác, bởi vì việc nhìn lại nhiều lớp của chuỗi trang trí bắt đầu đẩy mẫu trang trí vượt quá ý định thực sự của nó.

Phần tiếp chúng ta sẽ áp dụng trên code thực tế.

Cài ứng dụng cafedev để dễ dàng cập nhật tin và học lập trình mọi lúc mọi nơi tại đây.

Tài liệu từ cafedev:

Nếu bạn thấy hay và hữu ích, bạn có thể tham gia các kênh sau của cafedev để nhận được nhiều hơn nữa:

Chào thân ái và quyết thắng!

Đăng ký kênh youtube để ủng hộ Cafedev nha các bạn, Thanks you!