Decorator Pattern - Java

Decorator Pattern là gì?

Đây là một dạng pattern trong nhóm cấu trúc. Nó giúp chúng ta mở rộng tính năng của 1 object có sẵn tại thời điểm chạy chương trình bằng cách bao bọc object đó trong 1 object mới và sau đó mở rộng tính năng trong object mới.

Khi nào chúng ta dùng Decorator Pattern?

Giả dụ chúng ta đang viết 1 thư viện gửi thông báo tới người dùng về những sự kiện quan trọng trong hệ thống (server hết ổ cứng, hết bộ nhớ, v.v...). Version ban đầu sẽ là 1 class Notifier với một vài biến và phương thức gửi thông báo. Phương thức này sẽ gửi 1 message tới danh sách các email được truyền vào qua constructor của class.

Vào một ngày đẹp trời, bạn nhận ra người dùng không thường xuyên kiểm tra email như bạn nghĩ. Họ thích sử dụng SMS, Facebook hay là Slack hơn. Và bạn sẽ nghĩ đến việc tạo ra các subclass SMS Notifier, Facebook Notifier và Slack Notifier.
Nhưng chuyện gì xảy ra nếu bạn gặp những khách hàng khó tính và họ muốn sử dụng cả SMS và Facebook. Lúc này bạn sẽ cố tạo ra các tổ hợp class để thỏa mãn yêu cầu của khách hàng.
Rõ ràng việc tổ chức chương trình có vấn đề. Bạn sẽ phải nổ não khi có thêm 1 phương thức thông báo mới như Skype chẳng hạn. Giải pháp đơn giản là sử dụng decorator pattern trong trường hợp này. Bạn sẽ có 1 BaseDecorator class dùng để bao bọc các phương thức thông báo.

Cấu trúc

Về cấu trúc của pattern này thì tương tự như những gì mình mô tả ở trên. Chỉ có 1 đặc điểm khác biệt đó chính là concrete class. Bạn có thể hiểu nó là phương thức gửi thông báo mặc định trong ví dụ trên.

Ví dụ Decorator Pattern trong Java

Mình sẽ làm ví dụ minh họa cho bài toán chúng ta gặp phải ở trên: Đầu tiên chúng ta sẽ có 1 interface Notifier Và 1 concree class EmailDecorator dùng cho phương thức thông báo mặc định qua email. Tiếp đến là BaseDecorator class dùng để bọc các phương thức mới. Và những phương thức thông báo mới. Cuối cùng là main class để chạy và ouput:D Khi chúng ta cần thêm 1 phương thức thông báo mới. Việc cần làm là extends BaseDecorator và gọi supper.send trong phương thức gửi thông báo ;) that's it.

Source code sử dụng trong bài viết: https://github.com/luubi/design-patterns/tree/master/src/main/java/com/vlt/decorator



Nguồn: Bài viết liên quan:

Bài viết liên quan


EmoticonEmoticon