Saya sedang mempelajari Pola Dekorator seperti yang didokumentasikan di GOF .
Tolong, bantu saya memahami Pola Dekorator . Bisakah seseorang memberikan contoh kasus penggunaan di mana ini berguna di dunia nyata?
decorator
design-patterns
odiseh
sumber
sumber
Jawaban:
Pertimbangkan sebuah toko pizza. Di toko pizza mereka akan menjual beberapa varietas pizza dan mereka juga akan menyediakan topping di menu. Sekarang bayangkan situasi di mana jika toko pizza harus memberikan harga untuk setiap kombinasi pizza dan topping. Bahkan jika ada empat pizza dasar dan 8 topping berbeda, aplikasi akan menjadi gila mempertahankan semua kombinasi pizza dan topping konkret ini.
Di sinilah pola dekorator.
Sesuai pola dekorator, Anda akan menerapkan topping karena dekorator dan pizza akan didekorasi oleh dekorator topping itu. Praktis setiap pelanggan menginginkan topping dari keinginannya dan jumlah tagihan akhir akan terdiri dari pizza dasar dan topping tambahan yang dipesan. Setiap dekorator topping akan tahu tentang pizza yang sedang didekorasi dan harganya. Metode GetPrice () dari objek Topping akan mengembalikan harga kumulatif pizza dan topping.
EDIT
Berikut adalah contoh kode penjelasan di atas.
sumber
Ini adalah contoh sederhana menambahkan perilaku baru ke objek yang ada secara dinamis, atau pola dekorator. Karena sifat bahasa dinamis seperti Javascript, pola ini menjadi bagian dari bahasa itu sendiri.
sumber
switch
atau sederhanaif
, Anda akan dapat mengklaim bahwa ini adalah contoh yang bagus dari menambahkan perilaku secara dinamis ke kelas. TETAPI, kita membutuhkan setidaknya dua kelas untuk mendefinisikan dekorator dan benda-benda yang dihiasi dalam pola ini.Perlu dicatat bahwa model Java i / o didasarkan pada pola dekorator. Layering pembaca ini di atas pembaca itu di atas ... adalah contoh dunia nyata dekorator.
sumber
Contoh - Skenario- Katakanlah Anda sedang menulis modul enkripsi. Enkripsi ini dapat mengenkripsi file yang jelas menggunakan DES - standar enkripsi data. Demikian pula, dalam suatu sistem Anda dapat memiliki enkripsi sebagai standar enkripsi AES - Advance. Anda juga dapat memiliki kombinasi enkripsi - DES Pertama, lalu AES. Atau Anda dapat memiliki AES pertama, lalu DES.
Diskusi- Bagaimana Anda akan memenuhi situasi ini? Anda tidak dapat terus membuat objek kombinasi tersebut - misalnya - AES dan DES - total 4 kombinasi. Dengan demikian, Anda perlu memiliki 4 objek individual. Ini akan menjadi kompleks karena jenis enkripsi akan meningkat.
Solusi - Terus susun kombinasi - tumpukan tergantung pada kebutuhan - pada saat run time. Keuntungan lain dari pendekatan tumpukan ini adalah Anda dapat melepasnya dengan mudah.
Inilah solusinya - dalam C ++.
Pertama, Anda memerlukan kelas dasar - unit dasar tumpukan. Anda dapat berpikir sebagai dasar tumpukan. Dalam contoh ini, file itu jelas. Mari kita ikuti selalu polimorfisme. Jadikan pertama sebagai kelas antarmuka dari unit dasar ini. Dengan cara ini, Anda bisa menerapkannya sesuai keinginan. Juga, Anda tidak perlu memikirkan ketergantungan sambil memasukkan unit mendasar ini.
Inilah kelas antarmuka -
Sekarang, terapkan kelas antarmuka ini -
Sekarang, mari kita buat kelas abstrak dekorator - yang dapat diperluas untuk menciptakan segala jenis rasa - di sini rasanya adalah jenis enkripsi. Kelas abstrak dekorator ini terkait dengan kelas dasar. Dengan demikian, dekorator "adalah" semacam kelas antarmuka. Jadi, Anda perlu menggunakan warisan.
Sekarang, mari kita buat kelas dekorator beton - Jenis enkripsi - AES -
Sekarang, katakanlah tipe dekoratornya adalah DES -
const std :: string desEncrypt = "DES Encrypted";
Mari kita membuat kode klien untuk menggunakan kelas dekorator ini -
Anda akan melihat hasil berikut -
Di sini adalah diagram UML - Representasi kelas untuk itu. Dalam hal ini, Anda ingin melewatkan kode dan fokus pada aspek desain.
sumber
strategy pattern
?Pola dekorator membantu Anda mengubah atau mengonfigurasi fungsionalitas objek Anda dengan merantai dengan subclass serupa lainnya dari objek ini.
Contoh terbaik adalah kelas InputStream dan OutputStream dalam paket java.io
sumber
Apa itu Pola Desain Penghias di Jawa.
Definisi formal dari pola Dekorator dari buku GoF (Pola Desain: Elemen Reusable Object-Oriented Software, 1995, Pearson Education, Inc. Penerbitan sebagai Pearson Addison Wesley) mengatakan Anda bisa,
"Lampirkan tanggung jawab tambahan pada objek secara dinamis. Dekorator memberikan alternatif yang fleksibel untuk subklasifikasi untuk memperluas fungsionalitas."
Katakanlah kita memiliki Pizza dan kita ingin menghiasinya dengan topping seperti Chicken Masala, Onion dan Mozzarella Cheese. Mari kita lihat bagaimana mengimplementasikannya di Java ...
Program untuk menunjukkan bagaimana menerapkan Pola Desain Dekorator di Jawa.
Pizza.java:
sumber
Saya telah menggunakan pola dekorator secara luas di tempat kerja saya. Saya membuat posting di blog saya tentang cara menggunakannya dengan logging.
sumber
Mari kita ambil contoh di mana Anda perlu membangun aplikasi yang menghitung harga berbagai jenis burger. Anda perlu menangani variasi burger yang berbeda, seperti "besar" atau "dengan keju", yang masing-masing memiliki harga relatif terhadap burger dasar. Misalnya, tambahkan $ 10 untuk burger dengan keju, tambahkan ekstra $ 15 untuk burger besar, dll.
Dalam hal ini Anda mungkin tergoda untuk membuat subclass untuk menangani ini. Kami mungkin mengungkapkan ini di Ruby sebagai:
Dalam contoh di atas, kelas BurgerWithCheese mewarisi dari Burger, dan mengganti metode harga untuk menambahkan $ 15 ke harga yang ditentukan dalam kelas super. Anda juga akan membuat kelas LargeBurger dan menentukan harga relatif terhadap Burger. Tetapi Anda juga perlu mendefinisikan kelas baru untuk kombinasi "besar" dan "dengan keju".
Sekarang apa yang terjadi jika kita perlu menyajikan "burger dengan kentang goreng"? Kami sudah memiliki 4 kelas untuk menangani kombinasi tersebut, dan kami perlu menambahkan 4 lagi untuk menangani semua kombinasi dari 3 properti - "besar", "dengan keju" dan "dengan kentang goreng". Kami membutuhkan 8 kelas sekarang. Tambahkan properti lain dan kita perlu 16. Ini akan tumbuh 2 ^ n.
Sebagai gantinya, mari kita coba mendefinisikan BurgerDecorator yang mengambil objek Burger:
Dalam contoh di atas, kami telah membuat kelas BurgerDecorator, dari mana kelas BurgerWithCheese mewarisi. Kami juga dapat mewakili variasi "besar" dengan membuat kelas LargeBurger. Sekarang kita bisa mendefinisikan burger besar dengan keju saat runtime sebagai:
Ingat bagaimana menggunakan pewarisan untuk menambahkan variasi "dengan kentang goreng" akan melibatkan penambahan 4 subkelas lainnya? Dengan dekorator, kami hanya akan membuat satu kelas baru, BurgerWithFries, untuk menangani variasi baru dan menangani ini saat runtime. Setiap properti baru akan membutuhkan lebih banyak dekorator untuk mencakup semua permutasi.
PS. Ini adalah versi singkat dari artikel yang saya tulis tentang penggunaan Pola Penghias di Ruby , yang dapat Anda baca jika Anda ingin mengetahui contoh yang lebih rinci.
sumber
Penghias:
Lihat artikel pembuatan sumber untuk lebih jelasnya.
Dekorator (Abstrak) : ini adalah kelas / antarmuka abstrak, yang mengimplementasikan antarmuka komponen. Ini berisi antarmuka Komponen. Dengan tidak adanya kelas ini, Anda memerlukan banyak subkelas ConcreteDecorators untuk kombinasi yang berbeda. Komposisi komponen mengurangi subkelas yang tidak perlu.
Contoh JDK:
Lihat pertanyaan SE di bawah ini untuk diagram UML dan contoh kode.
Pola dekorator untuk IO
Artikel yang berguna:
journaldev
wikipedia
Contoh kata asli dari pola Penghias: VendingMachineDecorator telah dijelaskan @
Kapan Menggunakan Pola Penghias?
Dalam contoh di atas, Teh atau Kopi (Minuman) telah didekorasi dengan Gula dan Lemon.
sumber
Pola dekorator mencapai tujuan tunggal yaitu secara dinamis menambahkan tanggung jawab pada objek apa pun .
Model Java I / O didasarkan pada pola dekorator.
sumber
Ada contoh di Wikipedia tentang mendekorasi jendela dengan scrollbar:
http://en.wikipedia.org/wiki/Decorator_pattern
Berikut adalah contoh 'dunia nyata' dari "anggota tim, ketua tim dan manajer", yang menggambarkan bahwa pola dekorator tidak tergantikan dengan warisan sederhana:
https://zishanbilal.wordpress.com/2011/04/28/design-patterns-by-examples-decorator-pattern/
sumber
Beberapa waktu yang lalu saya telah refactored basis kode menggunakan pola dekorator, jadi saya akan mencoba menjelaskan kasus penggunaan.
Mari kita asumsikan kita memiliki seperangkat layanan dan berdasarkan apakah pengguna telah memperoleh lisensi layanan tertentu, kita perlu memulai layanan.
Semua layanan memiliki antarmuka yang sama
Pra Refactoring
Jika Anda mengamati dengan seksama,
ServiceSupport
tergantung padaLicenseManager
. Tetapi mengapa harus bergantungLicenseManager
? Bagaimana jika kami membutuhkan layanan latar belakang yang tidak perlu memeriksa informasi lisensi. Dalam situasi saat ini kita harus entah bagaimana berlatihLicenseManager
untuk kembalitrue
ke layanan latar belakang. Pendekatan ini tampaknya tidak baik bagi saya. Menurut saya cek lisensi dan logika lainnya saling orthogonal.Jadi Pola Penghias datang untuk menyelamatkan dan di sini mulai refactoring dengan TDD.
Posting Refactoring
Takeaways
sumber
Mari kita ambil contoh PubG. Senapan serbu bekerja paling baik dengan zoom 4x dan sementara kita berada di atasnya, kita juga akan membutuhkan kompensator dan penekan. Ini akan mengurangi mundur dan mengurangi suara tembakan serta gema. Kami perlu menerapkan fitur ini di mana kami akan memungkinkan pemain untuk membeli senjata favorit mereka dan aksesori mereka. Pemain dapat membeli pistol atau aksesori atau semua aksesori dan mereka akan dibebankan sesuai.
Mari kita lihat bagaimana pola dekorator diterapkan di sini:
Misalkan seseorang ingin membeli SCAR-L dengan ketiga aksesori yang disebutkan di atas.
Ini akan mengarah ke diagram kelas seperti ini:
Sekarang, kita dapat memiliki kelas seperti ini:
Kami juga dapat menambahkan aksesori lain dan menghias Pistol kami.
Referensi:
https://nulpointerexception.com/2019/05/05/a-beginner-guide-to-decorator-pattern/
sumber
Pola Desain Penghias : Pola ini membantu memodifikasi karakteristik suatu objek saat runtime. Ini memberikan rasa yang berbeda untuk suatu objek dan memberikan fleksibilitas untuk memilih bahan apa yang ingin kita gunakan dalam rasa itu.
Contoh Kehidupan Nyata: Katakanlah Anda memiliki kursi kabin utama dalam penerbangan. Sekarang Anda diperbolehkan memilih beberapa fasilitas dengan tempat duduk. Setiap kemudahan memiliki biaya sendiri yang terkait dengannya. Sekarang jika pengguna memilih Wifi dan makanan premium, ia akan dikenakan biaya untuk kursi + wifi + makanan premium.
Dalam hal ini pola desain dekorator dapat sangat membantu kami. Kunjungi tautan di atas untuk memahami lebih lanjut tentang pola dekorator dan penerapan satu contoh kehidupan nyata.
sumber