definisi
Kombinasi, sesuai namanya, mengacu pada menciptakan entitas tunggal dengan objek yang berisi banyak komponen. Entitas tunggal ini akan berfungsi sebagai titik akses untuk semua komponen ini, dan sementara ini sangat menyederhanakan operasi, ini juga bisa sangat menipu, karena tidak ada cara implisit untuk secara jelas menunjukkan berapa banyak komponen yang dikandung kombinasi.
Tujuan dari mode kombinasi adalah untuk memisahkan program klien dari arsitektur internal elemen kompleks, sehingga program klien memperlakukan semua elemen anak secara setara.
Setiap node anak dapat membuat keberadaan yang kompleks. Untuk simpul induk, tidak perlu mengetahui kompleksitas simpul anak atau mengimplementasikan kompleksitas simpul anak. Hanya perlu memperhatikan metode spesifik dari simpul anak, sehingga simpul anak dapat digunakan. Menyederhanakan hubungan antara ayah dan putra.
Hal yang sama berlaku untuk node anak. Paparan antarmuka yang berlebihan terkadang merupakan penyalahgunaan, dan juga mengurangi ketergantungan pada faktor -faktor eksternal.
Contoh
Lebih baik kami menggunakan kombinasi ilusi. Pada gambar berikut, Anda dapat melihat dua jenis objek yang berbeda: wadah dan perpustakaan adalah kombinasi dan gambar adalah bilah. Kombinasi dapat membawa anak -anak, tetapi umumnya tidak melakukan lebih banyak perilaku. Pisau ini berisi sebagian besar perilaku, tetapi tidak dapat membawa anak, setidaknya tidak dalam contoh kombinasi tradisional.
Contoh ini membuat perpustakaan gambar sebagai contoh pola kombinasi. Hanya ada tiga level: album, perpustakaan, dan gambar. Album dan perpustakaan akan digabungkan, dan gambarnya adalah bilah, seperti yang ditunjukkan pada gambar di atas. Ini adalah struktur yang lebih eksplisit daripada kombinasi itu sendiri yang dibutuhkan, tetapi untuk contoh ini masuk akal untuk membatasi level ini hanya pada kombinasi atau bilah. Kombinasi standar tidak membatasi tingkat struktural mana yang dapat memiliki bilah, juga tidak membatasi jumlah bilah.
Untuk memulai, Anda harus terlebih dahulu membuat "kelas" Composite Gallery untuk album dan perpustakaan Anda. Perhatikan bahwa saya menggunakan jQuery untuk melakukan operasi DOM untuk menyederhanakan proses.
var galericomposite = fungsi (heading, id) {this.children = []; this.element = $ ('<div id = "' + id + '"> </div>') .append ('<h2>' + heading + '</h2>');} galericomposite.prototype = {add: function (anak) {this.children.push (anak); this.element.append (child.getElement ()); }, hapus: function (anak) {untuk (var node, i = 0; node = this.getChild (i); i ++) {if (node == anak) {this.children.splice (i, 1); this.element.detach (child.getElement ()); Kembali Benar; } if (node.remove (anak)) {return true; }} return false; }, getChild: function (i) {return this.children [i]; }, hide: function () {for (var node, i = 0; node = this.getChild (i); i ++) {node.hide (); } this.element.hide (0); }, show: function () {for (var node, i = 0; node = this.getChild (i); i ++) {node.show (); } this.element.show (0); }, getElement: function () {return this.element; }}Lokasi ini agak rumit, dapatkah saya mengizinkan saya menjelaskan lebih lanjut? Kami membangun kombinasi ini dengan menggunakan metode ADD, Hapus, dan GetChild GetChild. Contoh ini tidak benar -benar menggunakan Remove and GetChild, tetapi mereka sangat berguna untuk membuat kombinasi dinamis. Metode persembunyian, pertunjukan, dan pembebasan digunakan untuk memanipulasi DOM. Kombinasi ini dimaksudkan untuk disajikan kepada pengguna di halaman sebagai representasi perpustakaan. Kombinasi ini dapat mengontrol elemen perpustakaan ini melalui Hide and Show. Jika Anda memanggil Hide di album, seluruh album akan hilang, atau Anda juga dapat menyebutnya pada satu gambar sehingga hanya gambar itu yang akan hilang.
Sekarang, buat kelas galeri. Perhatikan bahwa ia menggunakan metode yang persis sama dengan Galeri Komposit. Dengan kata lain, mereka menerapkan antarmuka yang sama, kecuali bahwa gambar adalah bilah, jadi tidak ada tindakan yang benar-benar dilakukan pada metode yang berhubungan dengan anak, sama seperti jika tidak memiliki anak. Kombinasi harus dijalankan dengan antarmuka yang sama karena elemen kombinasi tidak tahu apakah itu adalah elemen kombinasi atau blade lain yang ditambahkan dengan sendirinya, jadi jika Anda mencoba memanggil metode ini pada anak -anaknya, Anda harus berjalan baik -baik saja tanpa kesalahan.
var galeriMage = function (src, id) {this.children = []; this.element = $('<img />') .attr('id', id) .attr('src', src);}GalleryImage.prototype = { // Due to this being a leaf, it doesn't use these methods, // but must implement them to count as implementing the // Composite interface add: function () { }, remove: function () { }, getChild: function () { }, sembunyikan: function () {this.element.hide (0); }, show: function () {this.element.show (0); }, getElement: function () {return this.element; }}Mengingat bahwa Anda telah membangun prototipe objek, Anda sekarang dapat menggunakannya. Dari bawah Anda dapat melihat kode untuk benar -benar membangun perpustakaan gambar.
var container = new GalleryComposite('', 'allgalleries');var gallery1 = new GalleryComposite('Gallery 1', 'galleries1');var gallery2 = new GalleryComposite('Gallery 2', 'gallery2');var image1 = new GalleryImage('image1.jpg', 'img1');var image2 = new GalleryImage('image2.jpg', 'img2'); var image3 = galeri baru ('image3.jpg', 'img3'); var image4 = galeri baru ('image4.jpg', 'img4'); galeri1.add (gambar1); galeri1.add (gambar2); galeri2.add (gambar3); galeri2.add (gambar4); container.add (galeri1); container.add (galeri2); // Pastikan untuk menambahkan kontainer atas ke dalam tubuh, // jika tidak, itu tidak akan pernah ada yang akan ditampilkan itu akan itu akan ada yang akan ditampilkan, itu akan itu akan ditampilkan itu akan itu akan ada yang akan ditampilkan itu akan itu akan itu akan itu akan ada. up.container.getElement (). appendTo ('body'); container.show ();Manfaat dari mode kombinasi:
Operasi sederhana juga dapat menghasilkan hasil yang kompleks. Anda hanya perlu melakukan operasi pada objek tingkat atas dan membiarkan setiap objek anak melewati operasi ini sendiri. Ini sangat berguna untuk operasi yang diulang.
Dalam mode kombinasi, kopling antara objek individual sangat longgar. Selama mereka menerapkan antarmuka yang sama, hanya sedikit membantu untuk mengubah posisi mereka atau menukar mereka. Ini mempromosikan penggunaan kembali kode dan juga kondusif untuk rekonstruksi kode.
Setiap kali operasi dilakukan pada objek gabungan tingkat atas, itu sebenarnya adalah pencarian yang mendalam dari seluruh struktur untuk menemukan node, dan programmer yang membuat objek gabungan tidak mengetahui detail ini. Sangat mudah untuk menambah, menghapus dan menemukan node dalam hierarki ini.
Kekurangan Mode Kombinasi:
Kemudahan penggunaan objek gabungan dapat menutupi biaya setiap operasi yang didukungnya. Karena setiap operasi yang dipanggil oleh objek gabungan akan diteruskan ke semua sub-objeknya. Jika hierarki ini besar, kinerja sistem akan terpengaruh. Operasi normal dari mode kombinasi membutuhkan beberapa bentuk antarmuka.
Saat menggabungkan objek dan kelas simpul digunakan sebagai alat pembungkus untuk elemen HTML, objek gabungan harus mematuhi aturan penggunaan HTML. Misalnya, tabel sulit dikonversi menjadi objek gabungan.
Semakin ketat inspeksi antarmuka, semakin andal kelas objek gabungan.