Глосарій

Decorator Pattern

Decorator — патерн, що динамічно додає новий функціонал об'єкту, не змінюючи його клас. Обгортає оригінальний об'єкт і розширює або змінює його поведінку, реалізуючи той самий інтерфейс.

Приклад

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 при спадкуванні — звичне явище; декоратори його уникають.