Главная мысль
Decorator динамически добавляет поведение отдельному объекту, не меняя остальные экземпляры того же типа. В JS — обёртки через higher-order functions или классы.
class Car {
drive ( ) {
return "Driving" ;
}
}
class CarDecorator {
constructor (car ) {
this .car = car;
}
drive ( ) {
return this .car .drive ();
}
}
class GPSDecorator extends CarDecorator {
drive ( ) {
return `${super .drive()} with GPS` ;
}
}
const myCarWithGPS = new GPSDecorator (new Car ());
myCarWithGPS.drive ();
Функциональный вариант: withLogging(fn), withRetry(fn) — тоже декораторы по сути.
Итог: оборачивай объект/функцию, чтобы нарастить поведение без правки исходного класса.