تخطَّ إلى المحتوى

Decorator

نمط الزخرفة Decorator

Decorator يضيف سلوكًا جديدًا لكائن موجود ديناميكيًا وقت التشغيل، بتغليفه داخل كائن آخر بنفس الواجهة، دون تعديل الكلاس الأصلي أو استخدام الوراثة.

كل Decorator يطبّق نفس واجهة الكائن الأصلي، ويحتفظ بمرجع له، ويضيف سلوكًا قبل أو بعد تفويض الاستدعاء للكائن المغلَّف. تقدر تكدّس عدة Decorators فوق بعضها لتركيب سلوكيات متعددة دون انفجار عدد الكلاسات الذي يحصل مع الوراثة (فئة فرعية لكل توليفة ممكنة).

الصياغة

class Decorator implements Component {
  constructor(wrapped) { this.wrapped = wrapped; }
  operation() { return this.wrapped.operation() + " + إضافة"; }
}

📄 مثال

class Coffee { cost() { return 10; } }

class MilkDecorator {
  constructor(coffee) { this.coffee = coffee; }
  cost() { return this.coffee.cost() + 2; }
}

class SugarDecorator {
  constructor(coffee) { this.coffee = coffee; }
  cost() { return this.coffee.cost() + 1; }
}

let order = new Coffee();
order = new MilkDecorator(order);
order = new SugarDecorator(order);
console.log(order.cost()); // 13

أهم النقاط

النقطةالوظيفة
التصنيفنمط هيكلي (Structural)
يحل مشكلةإضافة سلوك لكائن دون فئات فرعية لكل توليفة ممكنة (تفجّر عدد الكلاسات مع الوراثة)
بديل عملي حديثفي JS/TS كثيرًا ما يُستبدل بتركيب دوال (function composition) بدل كلاسات مغلِّفة

خصائص ذات صلة

🎓 تريد فهم الصورة الكاملة خطوة بخطوة؟ ابدأ من مسار OOP الكامل بالعربي.