Decorator Pattern (Nhóm cấu trúc)
Cho phép thêm hành vi mới vào đối tượng bằng cách đặt chúng bên trong các đối tượng BAO BỌC (wrapper) đặc biệt chứa hành vi này - thêm chức năng vào đối tượng hiện có mà không sửa code của chúng, giảm thiểu rủi ro gây lỗi.
🔍 Dấu hiệu nhận biết
Các yêu cầu bổ sung thêm hành vi cho đối tượng, dựa trên hành vi gốc có thể là dấu hiệu cần dùng Decorator.
Ví dụ: hệ thống bán ô tô với các tùy chọn phụ trợ
Giá cơ bản 20,000 USD; lắp thêm hệ thống phụ trợ → giá thay đổi:
<?php
interface Car {
public function cost();
public function description();
}
class BasicCar implements Car {
public function cost() { return 20000; }
public function description() { return "Ô tô cơ bản"; }
}
// Decorator trừu tượng: bọc một Car bên trong
abstract class CarDecorator implements Car {
protected $car;
public function __construct(Car $car) { $this->car = $car; }
public function cost() { return $this->car->cost(); }
public function description() { return $this->car->description(); }
}
// Decorate thêm hệ thống định vị
class NavigationSystem extends CarDecorator {
public function cost() { return $this->car->cost() + 2000; }
public function description() {
return $this->car->description() . ", có hệ thống định vị";
}
}
// Decorate thêm ghế da
class LeatherSeats extends CarDecorator {
public function cost() { return $this->car->cost() + 1500; }
public function description() {
return $this->car->description() . ", có ghế da";
}
}
$basicCar = new BasicCar(); // 20000
$carWithNav = new NavigationSystem($basicCar); // 22000
$carWithSeats = new LeatherSeats($basicCar); // 21500
// Bọc CHỒNG nhiều decorator:
$carFull = new NavigationSystem(new LeatherSeats($basicCar)); // 23500
echo $carFull->description(); // Ô tô cơ bản, có ghế da, có hệ thống định vịĐiểm mạnh: bọc chồng bao nhiêu lớp tuỳ ý - mỗi lớp cộng thêm hành vi của mình lên kết quả của lớp trong.
Liên quan
- Adapter Pattern - cùng nhóm cấu trúc (Adapter đổi interface, Decorator thêm hành vi)
- Composition over Inheritance - decorator “có một” Car bên trong
- Open Closed Principle - thêm chức năng không sửa code gốc