memperkenalkan
Komposit menggabungkan objek ke dalam struktur pohon untuk mewakili hierarki "sebagian total". Mode kombinasi membuat pengguna konsisten dengan penggunaan objek individu dan objek gabungan.
Skenario umum termasuk mekanisme kontrol dalam ASP.NET (yaitu, kontrol dapat berisi kontrol anak, yang dapat beroperasi secara rekursif, menambah, dan menghapus kontrol anak), dan juga, ada mekanisme DOM. Node DOM dapat berisi node anak. Apakah itu node induk atau simpul anak, ia memiliki fungsi umum untuk menambah, menghapus, dan melintasi node anak. Oleh karena itu, kunci dari pola kombinasi adalah memiliki kelas abstrak, yang dapat mewakili elemen anak dan elemen induk.
teks
Misalnya, ada restoran yang menyediakan berbagai hidangan. Setiap tabel memiliki menu. Menu mencantumkan hidangan yang dimaksud dengan restoran, termasuk kue -kue sarapan, makan siang, makan malam, dll. Setiap makanan memiliki berbagai item menu. Dengan asumsi bahwa kedua item menu dan seluruh menu harus dicetak, dan sub-item dapat ditambahkan, seperti hidangan baru dapat ditambahkan untuk makan siang, dan gula dapat ditambahkan untuk item menu seperti kopi.
Dalam hal ini, kita dapat menggunakan kombinasi untuk mewakili konten ini sebagai hierarki. Mari kita uraikan langkah implementasi kita satu per satu.
Langkah pertama adalah mengimplementasikan fungsi menuComponen fungsi "kelas abstrak" kami:
Salinan kode adalah sebagai berikut:
var menucomponent = function () {
};
Menucomponent.prototype.getName = function () {
Lempar kesalahan baru ("Metode ini harus ditulis ulang!");
};
Menucomponent.prototype.getDescription = function () {
Lempar kesalahan baru ("Metode ini harus ditulis ulang!");
};
Menucomponent.prototype.getPrice = function () {
Lempar kesalahan baru ("Metode ini harus ditulis ulang!");
};
Menucomponent.prototype.isvetarian = function () {
Lempar kesalahan baru ("Metode ini harus ditulis ulang!");
};
Menucomponent.prototype.print = function () {
Lempar kesalahan baru ("Metode ini harus ditulis ulang!");
};
Menucomponent.prototype.add = function () {
Lempar kesalahan baru ("Metode ini harus ditulis ulang!");
};
Menucomponent.prototype.remove = function () {
Lempar kesalahan baru ("Metode ini harus ditulis ulang!");
};
Menucomponent.prototype.getChild = function () {
Lempar kesalahan baru ("Metode ini harus ditulis ulang!");
};
Fungsi ini menyediakan dua jenis metode, satu adalah untuk mendapatkan informasi, seperti harga, nama, dll., Dan yang lainnya adalah metode operasi umum, seperti mencetak, menambah, menghapus, dan mendapatkan submenu.
Langkah kedua adalah membuat hidangan dasar:
Salinan kode adalah sebagai berikut:
var Menuitem = fungsi (SNAME, SDESCRIPTION, BVEGETARIAN, NPRICE) {
Menucomponent.Apply (ini);
this.sname = sname;
this.sdescription = sdescription;
this.bvetarian = bvetarian;
this.nprice = nprice;
};
Menuitem.prototype = Menucomponent baru ();
MenuUtem.prototype.getName = function () {
kembalikan nama ini;
};
MenuUtem.prototype.getDescription = function () {
kembalikan ini.sdescription;
};
MenuUtem.prototype.getPrice = function () {
kembalikan ini.nprice;
};
Menuitem.prototype.isvetarian = function () {
kembalikan ini.
};
Menuitem.prototype.print = function () {
console.log (this.getName () + ":" + this.getDescription () + "," + this.getPrice () + "euro");
};
Seperti yang dapat dilihat dari kode, kami hanya memprotes ulang metode 4 untuk mendapatkan informasi dan metode cetak, dan tidak membebani 3 metode operasi lainnya, karena hidangan dasar tidak termasuk cara untuk menambah, menghapus, dan mendapatkan sub-dish.
Langkah 3: Buat hidangan:
Salinan kode adalah sebagai berikut:
var menu = function (sname, sdescription) {
Menucomponent.Apply (ini);
this.amenucomponents = [];
this.sname = sname;
this.sdescription = sdescription;
this.createIterator = function () {
Lemparkan kesalahan baru ("Metode ini harus ditimpa!");
};
};
Menu.prototype = new Menucomponent ();
Menu.prototype.add = fungsi (omenucomponent) {
// Tambahkan pengganti
this.amenucomponents.push (omenucomponent);
};
Menu.prototype.remove = fungsi (omenucomponent) {
// Hapus pengganti
var amenuitems = [];
var nmenuitem = 0;
var nlenMenuitems = this.amenucomponents.length;
var oitem = null;
untuk (; nMenuitem <nlenMenuitems;) {
oitem = this.amenucomponents [nMenuitem];
if (oitem! == omenucomponent) {
Amenuitems.push (oitem);
}
nMenuitem = nMenuitem + 1;
}
this.amenucomponents = amenuitems;
};
Menu.prototype.getChild = function (nindex) {
// Dapatkan pengganti yang ditentukan
kembalikan ini.amenucomponents [nindex];
};
Menu.prototype.getName = function () {
kembalikan nama ini;
};
Menu.prototype.getDescription = function () {
kembalikan ini.sdescription;
};
Menu.prototype.print = function () {
// Cetak hidangan saat ini dan semua sub-dishe
console.log (this.getName () + ":" + this.getDescription ());
Console.log ("--------------------------------------------");
var nMenucomponent = 0;
var nlenmenucomponents = this.amenucomponents.length;
var omenucomponent = null;
untuk (; nMenucomponent <nlenMenucomponents;) {
omenucomponent = this.amenucomponents [nMenucomponent];
omenucomponent.print ();
nMenucomponent = nMenucomponent + 1;
}
};
Perhatikan bahwa selain mengimplementasikan metode penambahan, menghapus, dan mendapatkan, metode cetak cetak adalah terlebih dahulu mencetak informasi DISH saat ini, dan kemudian lilitkan melalui pencetakan semua informasi sub-dish.
Langkah 4: Buat hidangan yang ditentukan:
Kita dapat membuat beberapa hidangan nyata, seperti makan malam, kopi, kue -kue, dll. Mereka semua menggunakan menu sebagai prototipe mereka, dan kodenya adalah sebagai berikut:
Salinan kode adalah sebagai berikut:
var dinnermenu = function () {
Menu.Apply (ini);
};
Dinnermenu.prototype = menu baru ();
var cafemenu = function () {
Menu.Apply (ini);
};
Cafemenu.prototype = menu baru ();
var pancakehouseMenu = function () {
Menu.Apply (ini);
};
PancakehouseMenu.prototype = menu baru ();
Langkah 5: Buat wadah menu teratas - Buku Menu:
Salinan kode adalah sebagai berikut:
var mattress = function (amenus) {
this.amenus = amenus;
};
Mattress.prototype.printmenu = function () {
this.amenus.print ();
};
Fungsi ini mengambil array menu sebagai parameter, dan nilainya menyediakan metode printMenu untuk mencetak semua konten menu.
Langkah 6, Metode Panggilan:
Salinan kode adalah sebagai berikut:
var opancakehouseMenu = menu baru ("menu rumah pancake", "sarapan");
var odinnermenu = menu baru ("menu makan malam", "makan siang");
var ocoffeemenu = menu baru ("menu kafe", "makan malam");
var oallmenus = menu baru ("semua menu", "semua menu digabungkan");
oallmenus.add (opancakehousemenu);
oallmenus.add (Odinnermenu);
odinnermenu.add (Menuitem baru ("pasta", "spaghetti dengan saus marinara, dan sepotong roti penghuni pertama", true, 3.89));
Odinnermenu.add (Ocofofeemenu);
Ocofeemenu.add (Menuitem baru ("Express", "Coffee From Machine", False, 0,99));
var aatattress = kasur baru (oallmenus);
Console.log ("---------------------------------------------");
aatattress.printmenu ();
Console.log ("---------------------------------------------");
Apakah siswa yang akrab dengan pengembangan kontrol ASP.NET terlihat akrab?
Meringkaskan
Skenario penggunaan mode kombinasi sangat jelas:
Ketika Anda ingin mewakili bagian dari objek - hierarki keseluruhan;
Anda ingin pengguna mengabaikan perbedaan antara objek gabungan dan objek tunggal, dan pengguna akan menggunakan semua objek dalam struktur gabungan secara seragam (metode)
Selain itu, pola ini sering digunakan dengan dekorator. Mereka biasanya memiliki kelas induk yang umum (yaitu, prototipe), sehingga dekorasi harus mendukung antarmuka komponen dengan operasi ADD, Hapus, dan GetChild.