Komposit Desain Pola
Oleh
chmood
Komposit Desain Pola
Menulis objek ke dalam struktur pohon untuk mewakili seluruh
bagian hirarki. Komposit memungkinkan klien memperlakukan objek individu dan
komposisi benda seragam.
Komposisi rekursif
"Direktori berisi entri, yang masing-masing bisa
menjadi sebuah direktori."
1-ke-banyak "memiliki" up "adalah"
hierarki
Masalah
Aplikasi perlu memanipulasi koleksi hirarkis "primitif"
dan "komposit" benda. Pengolahan dari objek primitif ditangani salah
satu cara, dan pengolahan objek komposit ditangani secara berbeda. Memiliki
untuk query "jenis" dari setiap objek sebelum mencoba untuk
memprosesnya tidak diinginkan.
Mendefinisikan kelas dasar abstrak (Komponen) yang
menentukan perilaku yang perlu dilakukan merata di semua objek primitif dan
komposit. Subclass kelas primitif dan Komposit off dari kelas Komponen. Setiap
objek Composite "pasangan" itu sendiri hanya untuk abstrak jenis
Komponen karena berhasil "anak" nya.
Menggunakan pola ini setiap kali Anda memiliki
"komposit yang mengandung komponen, yang masing-masing bisa menjadi
komposit".
Metode manajemen anak [misalnya addChild (), removeChild ()]
biasanya harus didefinisikan dalam kelas Komposit. Sayangnya, keinginan untuk
mengobati Primitif dan Komposit seragam mengharuskan metode ini dipindahkan ke
kelas Komponen abstrak. Lihat "Pendapat" di bawah untuk diskusi
tentang "keselamatan" versus masalah "transparansi".
Struktur
Komposit yang mengandung komponen, yang masing-masing bisa
menjadi Composite
Menu yang berisi item menu, yang masing-masing bisa menjadi
menu.
Baris-kolom layout GUI manajer yang mengandung widget, yang
masing-masing bisa menjadi baris-kolom layout GUI manajer.
Direktori yang berisi file, yang masing-masing bisa menjadi
sebuah direktori.
Kontainer yang berisi Elements, yang masing-masing bisa
menjadi sebuah wadah.
Contoh
Composite menyusun objek ke dalam struktur pohon dan
memungkinkan klien memperlakukan objek individu dan komposisi seragam. Meskipun
contoh yang abstrak, ekspresi aritmatika yang Komposit. Sebuah ekspresi
aritmatika terdiri dari operan, operator (+ - * /), dan operan lain. Operan
bisa menjadi nomor, atau expresssion aritmatika lain. Dengan demikian, 2 + 3
dan (2 + 3) + (4 * 6) keduanya ekspresi valid.
Periksa daftar
Pastikan bahwa masalah Anda adalah tentang mewakili
"seluruh bagian" hubungan hirarkis.
Pertimbangkan heuristik, "Kontainer yang berisi
containees, yang masing-masing bisa menjadi sebuah wadah." Misalnya,
"Sidang yang mengandung komponen, yang masing-masing bisa menjadi
perakitan." Membagi konsep domain Anda ke dalam kelas kontainer, dan kelas
containee.
Buat "common denominator terendah" antarmuka yang
membuat wadah dan containees dipertukarkan. Ini harus menentukan perilaku yang
perlu dilakukan secara seragam di semua containee dan wadah benda.
Semua kelas kontainer dan containee mendeklarasikan
"adalah" hubungan dengan antarmuka.
Semua kelas kontainer menyatakan satu-ke-banyak
"memiliki" hubungan dengan antarmuka.
Kelas kontainer pengaruh polimorfisme untuk mendelegasikan
ke objek containee mereka.
Metode manajemen anak [misalnya addChild (), removeChild ()]
biasanya harus didefinisikan dalam kelas Komposit. Sayangnya, keinginan untuk
mengobati Leaf dan Composite benda seragam mungkin mengharuskan metode ini
dipromosikan ke kelas Komponen abstrak. Lihat Gang of Four untuk diskusi ini
"aman" versus "transparansi" trade-off.
Aturan praktis
Komposit dan dekorator memiliki diagram struktur yang mirip,
mencerminkan fakta bahwa keduanya bergantung pada komposisi rekursif untuk
mengatur jumlah terbuka benda.
Komposit dapat dilalui dengan Iterator. Pengunjung dapat
menerapkan operasi selama Komposit. Komposit bisa menggunakan Rantai Tanggung
Jawab untuk membiarkan komponen mengakses properti global melalui orang tua
mereka. Hal ini juga bisa menggunakan dekorator untuk menimpa properti ini pada
bagian dari komposisi. Itu bisa menggunakan Observer untuk mengikat satu
struktur objek yang lain dan Negara untuk membiarkan komponen mengubah perilaku
sebagai perubahan keadaan.
Komposit dapat membiarkan Anda menulis Mediator keluar dari
potongan-potongan kecil melalui komposisi rekursif.
Dekorator dirancang untuk membiarkan Anda menambahkan
tanggung jawab untuk objek tanpa subclassing. Fokus komposit adalah bukan pada
hiasan tetapi pada representasi. Maksud ini berbeda tetapi saling melengkapi.
Akibatnya, Komposit dan dekorator sering digunakan dalam konser.
Kelas terbang sering dikombinasikan dengan Composite untuk
melaksanakan bersama node daun.
Pendapat
Inti dari pola Komposit adalah bahwa Composite dapat diobati
atom, seperti daun. Jika Anda ingin memberikan protokol Iterator, baik, tapi
saya pikir itu adalah di luar pola itu sendiri. Di jantung dari pola ini adalah
kemampuan untuk klien untuk melakukan operasi pada objek tanpa perlu tahu bahwa
ada banyak benda di dalam.
Mampu mengobati koleksi heterogen benda atom (atau
transparan) mensyaratkan bahwa "manajemen anak" antarmuka
didefinisikan pada akar hirarki kelas Composite (kelas Komponen abstrak).
Namun, pilihan ini biaya keselamatan Anda, karena klien mungkin mencoba untuk
melakukan hal-hal berarti seperti add dan menghapus objek dari objek daun. Di
sisi lain, jika Anda "desain untuk keamanan", antarmuka manajemen
anak ini dideklarasikan pada kelas Komposit, dan Anda kehilangan transparansi
karena daun dan Komposit sekarang memiliki antarmuka yang berbeda.
Implementasi Smalltalk dari pola Komposit biasanya tidak
memiliki antarmuka untuk mengelola komponen dalam antarmuka Komponen, tetapi
dalam antarmuka Composite. Implementasi C ++ cenderung meletakkannya di
antarmuka Komponen. Ini adalah fakta yang sangat menarik, dan satu yang saya
sering merenungkan. Saya dapat menawarkan teori untuk menjelaskannya, tapi
tidak ada yang tahu pasti mengapa itu benar.
Kelas Komponen saya tidak tahu bahwa Komposit ada. Mereka
tidak memberikan bantuan untuk navigasi Komposit, maupun bantuan untuk mengubah
isi dari Komposit. Hal ini karena saya ingin kelas dasar (dan semua turunannya)
untuk dapat digunakan kembali dalam konteks yang tidak memerlukan Komposit.
Ketika diberi pointer kelas dasar, jika saya benar-benar perlu tahu apakah atau
tidak itu adalah Komposit, saya akan menggunakan dynamic_cast untuk memikirkan
hal ini. Dalam kasus-kasus di mana dynamic_cast terlalu mahal, saya akan
menggunakan Pengunjung.
Umum keluhan: "jika saya mendorong antarmuka Composite
turun ke kelas Komposit, bagaimana aku akan menghitung (yaitu melintasi)
struktur yang kompleks?" Jawaban saya adalah bahwa ketika saya memiliki
perilaku yang berlaku untuk hierarki seperti yang disajikan dalam pola
Composite, saya biasanya menggunakan Pengunjung, sehingga pencacahan tidak
masalah - Pengunjung tahu dalam setiap kasus, apa jenis objek itu berurusan
dengan. Pengunjung tidak perlu setiap objek untuk menyediakan sebuah antarmuka
pencacahan.
Komposit tidak memaksa Anda untuk memperlakukan semua
komponen sebagai Komposit. Ini hanya memberitahu Anda untuk menempatkan semua
operasi yang ingin Anda memperlakukan "seragam" di kelas Komponen.
Jika menambah, menghapus, dan operasi serupa tidak bisa, atau tidak harus,
diperlakukan secara seragam, maka jangan menempatkan mereka di kelas dasar
Komponen. Ingat, dengan cara, bahwa setiap pola yang diagram struktur tidak
mendefinisikan pola; itu hanya menggambarkan apa yang dalam pengalaman kami
merupakan realisasi umum daripadanya. Hanya karena Composite ini diagram struktur
menunjukkan operasi manajemen anak di kelas dasar Komponen tidak berarti semua
implementasi dari pola harus melakukan hal yang sama.
Category
Komentar