Dekorator Pola Desain
Oleh
chmood
Dekorator Pola Desain
Melampirkan tanggung jawab tambahan untuk sebuah objek
dinamis. Dekorator memberikan alternatif fleksibel untuk subclassing untuk
memperluas fungsionalitas.
Hiasan klien-ditentukan dari objek inti dengan rekursif
membungkusnya.
Membungkus hadiah, memasukkannya ke dalam kotak, dan
membungkus kotak.
Anda ingin menambahkan perilaku atau negara untuk objek
individu saat run-time. Warisan tidak layak karena statis dan berlaku untuk
seluruh kelas.
Diskusi
Misalkan Anda bekerja pada sebuah toolkit antarmuka pengguna
dan Anda ingin mendukung menambahkan perbatasan dan scroll bar untuk jendela.
Anda bisa mendefinisikan hirarki warisan seperti .
Tapi pola dekorator menunjukkan memberikan klien kemampuan
untuk menentukan kombinasi "fitur" apa pun yang diinginkan.
Widget* aWidget = new BorderDecorator(
new HorizontalScrollBarDecorator(
new VerticalScrollBarDecorator(
new Window( 80, 24 ))));
aWidget->draw();
Fleksibilitas ini dapat dicapai dengan desain berikut.
Contoh lain cascading (atau chaining) dilengkapi
bersama-sama untuk menghasilkan objek kustom mungkin terlihat seperti ..
Stream* aStream = new CompressingStream(
new ASCII7Stream(
new FileStream("fileName.dat")));
aStream->putString( "Hello world" );
Solusi untuk kelas ini masalah melibatkan encapsulating objek asli dalam sebuah antarmuka wrapper abstrak. Kedua benda dekorator dan objek inti mewarisi dari antarmuka abstrak ini. Antarmuka menggunakan komposisi rekursif untuk memungkinkan jumlah yang tidak terbatas dekorator "lapisan" yang akan ditambahkan ke setiap objek inti.
Perhatikan bahwa pola ini memungkinkan tanggung jawab yang akan ditambahkan ke sebuah objek, tidak metode untuk antarmuka obyek. Antarmuka yang disajikan kepada klien harus tetap konstan sebagai lapisan berturut-turut ditentukan.
Juga mencatat bahwa identitas obyek inti sekarang telah "tersembunyi" dalam objek dekorator. Mencoba untuk mengakses objek inti langsung sekarang masalah.
Struktur
Klien selalu tertarik CoreFunctionality.doThis (). Klien
mungkin, atau mungkin tidak, tertarik OptionalOne.doThis () dan
OptionalTwo.doThis (). Masing-masing kelas selalu mendelegasikan ke kelas dasar
dekorator, dan kelas yang selalu delegasi ke terkandung "wrappee"
objek.
Contoh
Dekorator menempel tanggung jawab tambahan untuk sebuah
objek dinamis. Ornamen yang ditambahkan ke pinus atau pohon cemara adalah
contoh dekorator. Lampu, karangan bunga, permen tongkat, ornamen kaca, dll,
dapat ditambahkan ke pohon untuk memberikan tampilan yang meriah. Ornamen tidak
mengubah pohon itu sendiri yang dikenali sebagai pohon Natal tanpa hiasan
khusus yang digunakan. Sebagai contoh fungsi tambahan, penambahan lampu memungkinkan
seseorang untuk "menyala" pohon Natal.
Contoh lain: pistol serbu adalah senjata mematikan pada itu
sendiri. Tetapi Anda dapat menerapkan tertentu "dekorasi" untuk
membuatnya lebih akurat, diam dan menghancurkan.
Periksa daftar
Pastikan konteksnya adalah: satu inti (atau non-opsional)
komponen, beberapa hiasan opsional atau pembungkus, dan antarmuka yang umum
bagi semua.
Buat "terendah umum Penyebut" antarmuka yang
membuat semua kelas dipertukarkan.
Buat kelas dasar tingkat kedua (dekorator) untuk mendukung
kelas wrapper opsional.
Kelas Core dan kelas dekorator mewarisi dari antarmuka LCD.
Kelas dekorator menyatakan hubungan komposisi ke antarmuka
LCD, dan ini data anggota diinisialisasi dalam konstruktor.
Para delegasi kelas dekorator ke objek LCD.
Mendefinisikan kelas dekorator diturunkan untuk setiap
perhiasan opsional.
Kelas dekorator berasal melaksanakan fungsi wrapper mereka -
dan - mendelegasikan ke kelas dasar dekorator.
Klien mengkonfigurasi jenis dan pemesanan Core dan dekorator
benda.
Aturan praktis
Adapter menyediakan antarmuka yang berbeda untuk subjek.
Proxy memberikan antarmuka yang sama. Dekorator menyediakan sebuah antarmuka
ditingkatkan.
Adaptor perubahan antarmuka obyek, dekorator meningkatkan
tanggung jawab obyek. Dekorator demikian lebih transparan kepada klien. Sebagai
akibatnya, dekorator mendukung komposisi rekursif, yang tidak mungkin dengan
Adapter murni.
Komposit dan dekorator memiliki diagram struktur yang mirip,
mencerminkan fakta bahwa keduanya bergantung pada komposisi rekursif untuk
mengatur jumlah terbuka benda.
Sebuah dekorator dapat dilihat sebagai Composite merosot
dengan hanya satu komponen. Namun, dekorator yang menambahkan tanggung jawab
tambahan - itu tidak dimaksudkan untuk objek agregasi.
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.
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.
Dekorator dan Proxy memiliki tujuan yang berbeda tetapi
struktur serupa. Keduanya menjelaskan bagaimana untuk memberikan tingkat tipuan
ke objek lain, dan implementasi menyimpan referensi ke objek yang mereka
meneruskan permintaan.
Dekorator memungkinkan Anda mengubah kulit obyek. Strategi memungkinkan
Anda mengubah nyali.
Category
Komentar