يقدم
يجمع المركب بين الكائنات في بنية شجرة لتمثيل التسلسل الهرمي "الجزئي". يجعل وضع المركب المستخدمين متسقة مع استخدام الكائنات الفردية والكائنات المدمجة.
تتضمن السيناريوهات الشائعة آلية التحكم في ASP.NET (أي ، يمكن أن يحتوي التحكم على التحكم في الطفل ، والذي يمكن أن يعمل بشكل متكرر وإضافة وحذف التحكم في الطفل) ، وبالمثل ، هناك آلية DOM. يمكن أن تحتوي عقدة DOM على العقد الفرعية. سواء كانت عقدة أولية أو عقدة طفل ، فإنها تحتوي على وظائف مشتركة لإضافة العقد الفرعية وحذفها واجتيازها. لذلك ، فإن مفتاح نمط الجمع هو أن يكون لديك فئة مجردة ، والتي يمكن أن تمثل كل من عناصر الأطفال وعناصر الوالدين.
نص
على سبيل المثال ، يوجد مطعم يوفر مجموعة متنوعة من الأطباق. كل جدول لديه قائمة. تسرد القائمة الأطباق التي يدور حولها المطعم ، بما في ذلك معجنات الإفطار والغداء والعشاء ، وما إلى ذلك. يحتوي كل وجبة على مجموعة متنوعة من عناصر القائمة. على افتراض أنه ينبغي طباعة كل من عناصر القائمة والقائمة بأكملها ، ويمكن إضافة العناصر الفرعية ، مثل الأطباق الجديدة يمكن إضافة لتناول طعام الغداء ، ويمكن إضافة السكر لعناصر القائمة مثل القهوة.
في هذه الحالة ، يمكننا استخدام المجموعة لتمثيل هذه المحتويات كتسلسلات هرمية. دعنا نقسم خطوات التنفيذ الخاصة بنا واحدة تلو الأخرى.
الخطوة الأولى هي تنفيذ وظيفة "فئة التجريد" الخاصة بنا
نسخة الكود كما يلي:
var menucomponent = function () {
} ؛
menucomponent.prototype.getName = function () {
رمي خطأ جديد ("يجب إعادة كتابة هذه الطريقة!") ؛
} ؛
menucomponent.prototype.getDescription = function () {
رمي خطأ جديد ("يجب إعادة كتابة هذه الطريقة!") ؛
} ؛
menucomponent.prototype.getPrice = function () {
رمي خطأ جديد ("يجب إعادة كتابة هذه الطريقة!") ؛
} ؛
menucomponent.prototype.isvegetarian = function () {
رمي خطأ جديد ("يجب إعادة كتابة هذه الطريقة!") ؛
} ؛
menucomponent.prototype.print = function () {
رمي خطأ جديد ("يجب إعادة كتابة هذه الطريقة!") ؛
} ؛
menucomponent.prototype.add = function () {
رمي خطأ جديد ("يجب إعادة كتابة هذه الطريقة!") ؛
} ؛
menucomponent.prototype.remove = function () {
رمي خطأ جديد ("يجب إعادة كتابة هذه الطريقة!") ؛
} ؛
menucomponent.prototype.getchild = function () {
رمي خطأ جديد ("يجب إعادة كتابة هذه الطريقة!") ؛
} ؛
توفر هذه الوظيفة نوعين من الطرق ، أحدهما هو الحصول على معلومات ، مثل السعر ، والاسم ، وما إلى ذلك ، والآخر هو طريقة تشغيل عامة ، مثل الطباعة ، وإضافة ، والحذف ، والحصول على القائمة الفرعية.
الخطوة الثانية هي إنشاء الأطباق الأساسية:
نسخة الكود كما يلي:
var menuitem = function (sname ، sdescription ، bvegetarian ، nprice) {
menucomponent.apply (هذا) ؛
this.sname = sname ؛
this.sdescription = sdescription ؛
this.bvegetarian = bvegetarian ؛
this.nprice = nprice ؛
} ؛
menuitem.prototype = new menucomponent () ؛
menuitem.prototype.getName = function () {
إرجاع هذا. اسم
} ؛
menuitem.prototype.getDescription = function () {
إرجاع هذا.
} ؛
menuitem.prototype.getPrice = function () {
إرجاع هذا.
} ؛
menuitem.prototype.isvegetarian = function () {
إرجاع هذا.
} ؛
menuitem.prototype.print = function () {
console.log (this.getName () + ":" + this.getDescription () + "،" + this.getPrice () + "EUROS") ؛
} ؛
كما يتضح من الكود ، قمنا فقط بإعادة النماذج من 4 طرق للحصول على المعلومات وطرق الطباعة ، ولم نقوم بإفراط في تحميل طرق التشغيل الثلاثة الأخرى ، لأن الأطباق الأساسية لا تتضمن طرقًا لإضافة وحذف والحصول على الأداء الفرعية.
الخطوة 3: إنشاء الأطباق:
نسخة الكود كما يلي:
var menu = function (sname ، sdescription) {
menucomponent.apply (هذا) ؛
this.amenucomponents = [] ؛
this.sname = sname ؛
this.sdescription = sdescription ؛
this.createiterator = function () {
رمي خطأ جديد ("يجب كتابة هذه الطريقة!") ؛
} ؛
} ؛
menu.prototype = new menucomponent () ؛
menu.prototype.add = function (omenucomponent) {
// إضافة بديل
this.amenucomponents.push (Omenucomponent) ؛
} ؛
menu.prototype.remove = function (omenucomponent) {
// حذف البدائل
var amenuitems = [] ؛
var nmenuitem = 0 ؛
var nlenmenuitems = this.amenucomponents.length ؛
var oitem = null ؛
لـ (؛ nmenuitem <nlenmenuitems ؛) {
oitem = this.amenucomponents [nmenuitem] ؛
if (oitem! == omenucomponent) {
Amenuitems.push (Oitem) ؛
}
nmenuitem = nmenuitem + 1 ؛
}
this.amenucomponents = amenuitems ؛
} ؛
menu.prototype.getChild = function (nindex) {
// احصل على البديل المحدد
إرجاع this.amenucomponents [nindex] ؛
} ؛
menu.prototype.getName = function () {
إرجاع هذا. اسم
} ؛
menu.prototype.getDescription = function () {
إرجاع هذا.
} ؛
menu.prototype.print = function () {
// طباعة الأطباق الحالية وجميع الأطباق الفرعية
console.log (this.getName () + ":" + this.getDescription ()) ؛
console.log ("------------------------------------------------------") ؛
var nmenucomponent = 0 ؛
var nlenmenucomponents = this.amenucomponents.length ؛
var omenucomponent = null ؛
لـ (؛ nmenucomponent <nlenmenucomponents ؛) {
omenucomponent = this.amenucomponents [nmenucomponent] ؛
Omenucomponent.print () ؛
nmenucomponent = nmenucomponent + 1 ؛
}
} ؛
لاحظ أنه بالإضافة إلى تنفيذ أساليب إضافة وحذف والحصول على ، تتمثل طريقة الطباعة في طباعة معلومات الطبق الحالية أولاً ، ثم حلقة من خلال طباعة جميع المعلومات الفرعية.
الخطوة 4: إنشاء الطبق المحدد:
يمكننا إنشاء العديد من الأطباق الحقيقية ، مثل العشاء والقهوة والمعجنات ، وما إلى ذلك.
نسخة الكود كما يلي:
var dinnermenu = function () {
menu.apply (هذا) ؛
} ؛
dinnermenu.prototype = new menu () ؛
var cafemenu = function () {
menu.apply (هذا) ؛
} ؛
cafemenu.prototype = new menu () ؛
var pancakehousemenu = function () {
menu.apply (هذا) ؛
} ؛
pancakehousemenu.prototype = new menu () ؛
الخطوة 5: إنشاء حاوية القائمة العليا - كتاب القائمة:
نسخة الكود كما يلي:
var mattress = function (amenus) {
this.amenus = amenus ؛
} ؛
mattress.prototype.printmenu = function () {
this.amenus.print () ؛
} ؛
تأخذ هذه الوظيفة صفيف قائمة كمعلمة ، وتوفر القيمة طريقة PrintMenu لطباعة جميع محتويات القائمة.
الخطوة 6 ، طريقة الاتصال:
نسخة الكود كما يلي:
var opancakehousemenu = قائمة جديدة ("قائمة الفطيرة البيت" ، "الإفطار") ؛
var odinnermenu = قائمة جديدة ("قائمة عشاء" ، "غداء") ؛
var ocoffeemenu = قائمة جديدة ("قائمة المقهى" ، "عشاء") ؛
var Oallmenus = قائمة جديدة ("All Menus" ، "All Menus Combined") ؛
Oallmenus.Add (OpancakeHeusemenu) ؛
Oallmenus.add (Odinnermenu) ؛
Odinnermenu.add (New Menuitem ("Pasta" ، "Spaghetti with Marinara Sauce ، وشريحة من خبز العجين المخمر" ، True ، 3.89)) ؛
Odinnermenu.add (Ocoffeemenu) ؛
Ocoffeemenu.add (New Menuitem ("Express" ، "Coffee from Machine" ، false ، 0.99)) ؛
var omattress = مرتبة جديدة (Oallmenus) ؛
console.log ("---------------------------------------------") ؛
omattress.printmenu () ؛
console.log ("---------------------------------------------") ؛
هل يبدو الطلاب الذين يعرفون تطوير ASP.NET مألوفًا؟
لخص
سيناريو استخدام وضع المركب واضح للغاية:
عندما تريد تمثيل جزء الكائن - التسلسل الهرمي الشامل ؛
تريد أن يتجاهل المستخدم الفرق بين كائن مشترك وكائن واحد ، وسيستخدم المستخدم جميع الكائنات في الهيكل المشترك بشكل موحد (الطرق)
بالإضافة إلى ذلك ، غالبًا ما يستخدم هذا النمط مع ديكورات. عادة ما يكون لديهم فئة من الوالدين المشتركة (أي النموذج الأولي) ، لذلك يجب أن تدعم الديكور واجهات المكونات مع عمليات الإضافة وإزالة وإلغاء.