interface Logger { log(string $msg): void; }
class FileLogger implements Logger { ... }
class TimestampLogger implements Logger {
public function __construct(private Logger $inner) {}
public function log(string $msg): void {
$this->inner->log(date('H:i:s') . ' ' . $msg);
}
}Декораторы комбинируются динамически: new JsonLogger(new TimestampLogger(new FileLogger())). Наследование потребовало бы N² подклассов для каждой комбинации. Декораторы избегают нарушения Open/Closed, типичного при наследовании.