يقدم
يقدم الديكور بدائل أكثر مرونة من الميراث. يستخدم الديكورات الكائنات المستخدمة لالتفاف الواجهة نفسها ، والتي لا تسمح لك فقط بإضافة السلوك إلى الطرق ، ولكن أيضًا قم بتعيين طرق مكالمات الكائنات الأصلية (مثل مُنشئ الديكور).
يتم استخدام الديكور لإضافة وظائف جديدة من خلال شكل طرق محملة. يمكن لهذا الوضع إضافة سلوكه الخاص قبل أو بعد ديكور لتحقيق غرض محدد.
نص
إذن ما هي فوائد وضع الديكور؟ كما ذكرنا سابقًا ، فإن الديكور هو بديل لتحقيق الميراث. عند تشغيل البرنامج النصي ، يؤثر إضافة السلوك إلى الفئة الفرعية على جميع حالات الفصل الأصلي ، لكن الديكور لا. بدلاً من ذلك ، يمكن أن يضيف سلوكًا جديدًا إلى كائنات مختلفة. الرمز التالي يشبه:
نسخة الكود كما يلي:
// فئة (وظيفة) تحتاج إلى زخرفة (وظيفة)
وظيفة macbook () {
this.cost = function () {
إرجاع 1000 ؛
} ؛
}
ذاكرة الوظيفة (MacBook) {
this.cost = function () {
إرجاع macbook.cost () + 75 ؛
} ؛
}
وظيفة BlurayDrive (MacBook) {
this.cost = function () {
إرجاع macbook.cost () + 300 ؛
} ؛
}
تأمين الوظيفة (MacBook) {
this.cost = function () {
إرجاع MacBook.cost () + 250 ؛
} ؛
}
// الاستخدام
var mymacbook = تأمين جديد (BlurayDrive جديد (ذاكرة جديدة (macbook () جديدة)))) ؛
console.log (mymacbook.cost ()) ؛
أدناه مثال آخر. عندما ندعو أداء الأداء على كائن الديكور ، فإنه لا يحتوي على سلوك ديكور فقط ، ولكن أيضًا يستدعي وظيفة الأداء للكائن السفلي.
نسخة الكود كما يلي:
وظيفة concreteclass () {
this.performTask = function () {
this.pretask () ؛
console.log ('القيام بشيء ما') ؛
this.posttask () ؛
} ؛
}
الوظيفة الملخصية (مزينة) {
this.performTask = function () {
Decorated.performTask () ؛
} ؛
}
وظيفة concretedEcoratorClass (مزينة) {
this.base = AbstractDecorator ؛
this.base (مزينة) ؛
Decorated.pretask = function () {
console.log ('قبل الاستدعاء ..') ؛
} ؛
Decorated.posttask = function () {
console.log ('postsling ..') ؛
} ؛
}
var concrete = new concreteclass () ؛
var decorator1 = concretedEcoratorClass (Concrete) ؛
var decorator2 = concretedEcoratorClass جديد (Decorator1) ؛
Decorator2.performTask () ؛
لنأخذ مثالًا شاملاً آخر:
نسخة الكود كما يلي:
var tree = {} ؛
tree.decorate = function () {
console.log ('تأكد من أن الشجرة فازت/' t السقوط ') ؛
} ؛
tree.getDecorator = function (deco) {
شجرة [Deco] .prototype = هذا ؛
إرجاع شجرة جديدة [ديكو] ؛
} ؛
tree.redballs = function () {
this.decorate = function () {
this.redballs.prototype.decorate () ؛ // الخطوة 7: قم أولاً بتنفيذ طريقة تزيين النموذج الأولي (هذا ملاك)
console.log ('وضعت على بعض الكرات الحمراء) ؛ // الخطوة 8 الإخراج الأحمر
// استخدم هاتين الخطوتين كطريقة تزيين الكرات الأحمر
}
} ؛
tree.blueballs = function () {
this.decorate = function () {
this.blueballs.prototype.decorate () ؛ // الخطوة 1: قم أولاً بتنفيذ طريقة تزيين النموذج الأولي ، أي tree.decorate ()
console.log ("إضافة كرات زرقاء") ؛ // الخطوة 2 الإخراج الأزرق
// استخدم هاتين الخطوتين حيث تزين الكرات الزرقاء
}
} ؛
tree.angel = function () {
this.decorate = function () {
this.angel.prototype.decorate () ؛ // الخطوة 4: قم أولاً بتنفيذ طريقة تزيين النموذج الأولي (هذه هي الكرات الزرقاء)
console.log ('An Angel on the Top') ؛ // الخطوة 5 الإخراج ملاك
// استخدم هذه الخطوات كأسلوب تزيين الملاك
}
} ؛
شجرة = tree.getDecorator ('blueballs') ؛ // الخطوة 3: قم بتعيين كائن blueballs للشجرة ، ولا يزال GetDecorator في النموذج الأصل متاحًا
شجرة = tree.getDecorator ('Angel') ؛ // الخطوة 6: تعيين كائن الملاك إلى شجرة. في هذا الوقت ، لا يزال GetDecorator في النموذج الأصل للنموذج الأصل متاحًا
شجرة = tree.getDecorator ('Redballs') ؛ // الخطوة 9: تعيين كائن Redballs إلى شجرة
tree.decorate () ؛ // الخطوة 10: تنفيذ طريقة تزيين كائن Redballs
لخص
نمط الديكور هو وسيلة لإضافة المزيد من الوظائف ديناميكيًا إلى الوظائف الموجودة. يتم وضع كل وظيفة يتم تزيينها في وظيفة منفصلة ، ثم استخدم هذه الوظيفة لالتفاف كائن الوظيفة الحالي ليتم تزيينه. لذلك ، عندما يحتاج السلوك الخاص إلى تنفيذ ، يمكن أن يستخدم رمز الاتصال بشكل انتقائي وتتابع وظيفة التزيين لالتفاف الكائن حسب الحاجة. الميزة هي أنه يميز المسؤوليات الأساسية للفئة (الوظيفة) عن الوظيفة الزخرفية.