Decorator bọc một đối tượng bằng một đối tượng khác cùng interface để thêm hành vi lúc chạy mà không sửa lớp gốc. Vì cùng interface, có thể lồng nhiều lớp bọc để cộng dồn tính năng.
Ví dụ: một DataSource được bọc bởi EncryptionDecorator rồi CompressionDecorator; hay Coffee được bọc Milk, Sugar để cộng giá. Mỗi decorator làm phần việc của mình rồi ủy quyền tiếp cho đối tượng bên trong.
Vì sao ưu tiên hơn kế thừa:
- Kế thừa để tổ hợp tính năng gây bùng nổ số lớp con (mọi kết hợp cần một lớp); decorator ghép linh hoạt lúc chạy bằng cách chồng lớp bọc.
- Tuân Open/Closed (thêm tính năng bằng lớp mới, không sửa lớp cũ) và ưu tiên composition over inheritance.
Ứng dụng: middleware HTTP, stream I/O (Java BufferedInputStream), UI wrappers.