Bisakah Anda memberikan penjelasan yang baik apa perbedaan antara Proxy dan Dekorator ?
Perbedaan utama yang saya lihat adalah bahwa ketika kita mengasumsikan bahwa Proxy menggunakan komposisi dan Dekorator menggunakan agregasi maka tampaknya menjadi jelas bahwa dengan menggunakan beberapa Dekorator, Anda dapat memodifikasi / menambahkan fungsionalitas ke instance yang sudah ada sebelumnya (menghias), sedangkan Proxy memiliki instance turunan dari kelas proksi dan mendelegasikannya menambahkan beberapa fitur tambahan (perilaku proxy).
Pertanyaannya adalah - Apakah Proxy yang dibuat dengan agregasi masih Proxy atau tepatnya Penghias ? Apakah diizinkan (menurut definisi dalam pola GoF) untuk membuat Proxy dengan agregasi?
oop
design-patterns
decorator
proxy-pattern
Łukasz Rzeszotarski
sumber
sumber
Jawaban:
Ini adalah kutipan langsung dari GoF (halaman 216).
Jawaban populer menunjukkan bahwa Proksi tahu tipe konkret dari delegasinya. Dari kutipan ini kita dapat melihat bahwa itu tidak selalu benar.
Perbedaan antara Proxy dan Dekorator menurut GoF adalah bahwa Proxy membatasi klien. Penghias tidak. Proksi dapat membatasi apa yang dilakukan klien dengan mengontrol akses ke fungsionalitas; atau mungkin membatasi apa yang diketahui klien dengan melakukan tindakan yang tidak terlihat dan tidak dikenal oleh klien. Penghias melakukan yang sebaliknya: meningkatkan apa yang dilakukan oleh delegasinya dengan cara yang terlihat oleh klien.
Kita dapat mengatakan bahwa Proxy adalah kotak hitam sedangkan Dekorator adalah kotak putih.
Hubungan komposisi antara wrapper dan delegate adalah hubungan yang salah untuk difokuskan ketika membandingkan Proxy dengan Dekorator, karena komposisi adalah fitur yang sama-sama dimiliki kedua pola ini. Hubungan antara pembungkus dan klien adalah yang membedakan kedua pola ini.
sumber
Perbedaan sesungguhnya bukanlah kepemilikan (komposisi versus agregasi), melainkan tipe-informasi.
Sebuah dekorator yang selalu melewati delegatee nya. Sebuah Proxy mungkin menciptakannya sendiri, atau dia mungkin memilikinya disuntikkan.
Tapi Proxy selalu tahu (lebih) jenis delegasi tertentu. Dengan kata lain, Proxy dan delegatee-nya akan memiliki tipe basis yang sama, tetapi Proxy menunjuk ke beberapa tipe turunan. Sebuah Decorator menunjuk ke tipe dasar sendiri. Dengan demikian, perbedaannya adalah dalam informasi waktu kompilasi tentang jenis delegasi.
Dalam bahasa yang dinamis, jika delegate disuntikkan dan kebetulan memiliki antarmuka yang sama, maka tidak ada perbedaan.
Jawaban atas pertanyaan Anda adalah ya".
sumber
Pola Dekorator berfokus pada penambahan fungsi secara dinamis ke suatu objek, sementara Pola Proxy berfokus pada pengontrolan akses ke suatu objek.
EDIT: -
Hubungan antara Proxy dan subjek nyata biasanya diatur pada waktu kompilasi, Proxy membuat contoh dalam beberapa cara, sedangkan Dekorator ditugaskan ke subjek saat runtime, hanya mengetahui antarmuka subjek.
sumber
Dekorator mendapatkan referensi untuk objek yang didekorasi (biasanya melalui konstruktor) sementara Proxy bertanggung jawab untuk melakukannya sendiri.
Proksi sama sekali tidak dapat membuat instance objek pembungkus (seperti ini lakukan ORM untuk mencegah akses yang tidak perlu ke DB jika bidang objek / pengambil tidak digunakan) sementara Dekorator selalu memegang tautan ke instance pembungkus aktual.
Proxy biasanya digunakan oleh frameworks untuk menambah keamanan atau caching / lazing dan dibangun oleh framework (bukan oleh developer reguler itu sendiri).
Dekorator biasanya digunakan untuk menambahkan perilaku baru ke kelas lama atau lama oleh pengembang itu sendiri berdasarkan antarmuka daripada kelas yang sebenarnya (sehingga bekerja pada berbagai contoh antarmuka, Proxy ada di sekitar kelas beton).
sumber
Perbedaan utama:
Sourcemaking artikel mengutip persamaan dan perbedaan dalam cara yang sangat baik.
Pertanyaan / tautan SE terkait:
Kapan Menggunakan Pola Penghias?
Apa perbedaan yang tepat antara pola Adaptor dan Proksi?
sumber
Proxy dan Dekorator berbeda dalam tujuan dan di mana mereka fokus pada implementasi internal. Proxy adalah untuk menggunakan objek jarak jauh, lintas proses, atau lintas jaringan seolah-olah itu adalah objek lokal. Dekorator adalah untuk menambahkan perilaku baru ke antarmuka asli.
Sementara kedua pola memiliki struktur yang sama, sebagian besar kompleksitas Proxy terletak dalam memastikan komunikasi yang tepat dengan objek sumber. Penghias, di sisi lain, berfokus pada penerapan perilaku yang ditambahkan.
sumber
Butuh beberapa saat untuk mencari tahu jawaban ini dan apa artinya sebenarnya. Beberapa contoh harus membuatnya lebih jelas.
Proxy
pertama:Dan:
Dan ada penelepon ini
Authorization
, yang sangat bodoh:Sejauh ini tidak ada yang tidak biasa, bukan? Dapatkan token dari layanan tertentu, gunakan token itu. Sekarang hadir satu persyaratan lagi untuk gambar, tambahkan logging: arti log token setiap kali. Sederhana untuk kasus ini, cukup buat
Proxy
:Bagaimana kita menggunakannya?
Perhatikan bahwa
LoggingDBAuthorization
memegang instance dariDBAuthorization
. KeduanyaLoggingDBAuthorization
danDBAuthorization
implementasikanAuthorization
.DBAuthorization
) antarmuka dasar (Authorization
). Dengan kata lain Proksi tahu persis apa yang sedang diproksi.Decorator
:Dimulai hampir sama dengan
Proxy
, dengan antarmuka:dan implementasi dari itu:
Dan sekarang kami ingin menambahkan kandidat yang lebih berpengalaman, yang menambahkan skor wawancara ditambah satu dari yang lain
JobSeeker
:Perhatikan bagaimana saya mengatakan itu ditambah satu dari JobSeeker lain , bukan
Newbie
. ADecorator
tidak tahu persis apa itu dekorasi, ia tahu hanya kontrak contoh yang dihiasi (ia tahu tentangJobSeeker
). Perhatikan di sini bahwa ini tidak sepertiProxy
; sebaliknya, tahu persis apa itu dekorasi.Anda mungkin mempertanyakan apakah sebenarnya ada perbedaan antara dua pola desain dalam kasus ini? Bagaimana jika kami mencoba menulis
Decorator
sebagaiProxy
?Ini jelas merupakan pilihan dan menyoroti seberapa dekat pola-pola ini; mereka masih ditujukan untuk skenario yang berbeda seperti yang dijelaskan dalam jawaban lain.
sumber
Proxy menyediakan antarmuka yang sama ke objek yang dibungkus, Penghias menyediakannya dengan antarmuka yang ditingkatkan, dan Proxy biasanya mengelola siklus hidup objek layanannya sendiri, sedangkan komposisi Dekorator selalu dikontrol oleh klien.
sumber