Dekorator Pola Desain

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.



Komentar