Perbedaan antara pola desain Fasad, Proxy, Adaptor, dan Dekorator? [Tutup]

137

Apa perbedaan antara pola desain Fasad, Proksi, Adaptor, dan Dekorator?

Saya tidak pernah membaca penjelasan yang jelas, apa milik Anda?

pengguna310291
sumber
@gavenkoa pertanyaan lain hanya tentang proxy dan dekorator
user310291
4
Luar biasa karena beberapa pertanyaan tertutup mengungkapkan diri mereka sangat berguna.
Lukas

Jawaban:

289

Adaptor mengadaptasi kelas / objek tertentu ke antarmuka baru. Dalam kasus yang pertama, banyak warisan biasanya digunakan. Dalam kasus terakhir, objek dibungkus oleh objek adaptor yang sesuai dan diedarkan. Masalah yang kami pecahkan di sini adalah antarmuka yang tidak kompatibel .

Fasad lebih seperti gerbang sederhana ke serangkaian fungsi yang rumit. Anda membuat kotak hitam untuk klien Anda agar tidak terlalu khawatir, yaitu membuat antarmuka lebih sederhana .

Proxy menyediakan antarmuka yang sama dengan kelas yang di-proxy-kan dan biasanya melakukan beberapa pekerjaan rumah tangga sendiri. (Jadi, alih-alih membuat banyak salinan objek yang berat, XAnda membuat salinan dari proxy ringan Pyang pada gilirannya mengelola Xdan menerjemahkan panggilan Anda sesuai kebutuhan.) Anda memecahkan masalah klien karena harus mengelola objek yang berat dan / atau kompleks .

Dekorator digunakan untuk menambahkan lebih banyak bubuk mesiu ke objek Anda (perhatikan istilah objek - Anda biasanya menghias objek secara dinamis saat runtime). Anda tidak menyembunyikan / merusak antarmuka objek yang ada, tetapi cukup memperluasnya saat runtime .

Sekarang setelah Anda memiliki dekorator yang terlibat, Anda mungkin ingin tahu mengapa penekanan pada objek kata - beberapa bahasa (seperti Java) tidak mengizinkan pewarisan virtual (yaitu beberapa pewarisan seperti yang dilakukan C ++) untuk memungkinkan Anda melakukannya di waktu kompilasi.

Karena kami telah menyeret beberapa warisan (dan berlian yang ditakuti) Anda akan mencari mixin - yang memerintahkan rangkaian antarmuka linier untuk mengatasi masalah beberapa warisan. Namun, mixin tidak bisa tercampur dengan baik. Dan kami berakhir dengan ciri - ciri - ya gumpalan kecil perilaku tanpa kewarganegaraan yang Anda lihat munculan sepanjang waktu dalam parameter template di C ++. Ciri-ciri mencoba mengatasi masalah komposisi dan dekomposisi perilaku dengan cara yang elegan sementara tidak menggunakan beberapa warisan atau rangkaian yang teratur.

dirkgently
sumber
1
HTH! Saya telah mencoba untuk memasukkan sebanyak yang saya bisa tanpa terlalu kabur. Maafkan ketidakmampuan saya untuk berbuat lebih baik. Saya telah membaca (disertasi PhD) makalah tentang ciri-ciri saja. Oleh karena itu, pengetahuan saya agak terbatas dan saya tidak cukup baik untuk menyesuaikan dengan semua pola di ruang ini;)
dirkgently
Anda mengantisipasi pertanyaan masa depan tentang mixin dan sifat tetapi saya belum melihatnya!
pengguna310291
1
Tautan perbandingan yang bagus (melalui wikipedia) untuk tiga yang pertama (Dekoratornya sangat berbeda): NetObjectives
Liviu
@Liviu Link Anda sudah mati. Saya berasumsi Anda awalnya menunjuk ke sana , tetapi kontennya sekarang tampaknya berada di balik login.
Jonathan H
@Sheljohn Tautan diperbarui: p: Tautan perbandingan yang baik (melalui wikipedia) untuk tiga yang pertama (Dekoratornya sangat berbeda) Sasaran Bersih (Mengambil teks, lihat "betweem": "Salah satu pertanyaan yang paling sering saya dapatkan di kelas adalah" apa perbedaan antara Adaptor, Proxy, dan Fasad? Mereka benar-benar tampak sama bagi saya ".)
Liviu
16

Tatapan

Anda bisa menggunakan fasad, misalnya, untuk membuat panggilan ke API lebih mudah. Lihatlah ini contoh fasad jarak jauh. Idenya di sini adalah bahwa implementasi penuh kode di server disembunyikan dari klien. Klien memanggil 1 metode API yang, pada gilirannya, dapat membuat 1 atau lebih panggilan API di server.

Adaptor

Contoh yang bagus dapat ditemukan di sini , di Wikipedia. Objek klien Sourceingin memanggil metode pada objek lain Target, tetapi antarmuka objek lain itu berbeda dengan yang diharapkan klien.

Masukkan objek adaptor.

Itu bisa menerima panggilan dari Sourceobjek dan, di belakang layar, memanggil Targetmetode yang harus digunakan.

Source->CallMethodAOnTarget() ---< Adaptor.CallMethodAOnTarget() this calls ---> Target.MethodWithDifferentSignatureAndName(int i)

Sedangkan untuk Proxy, saya tidak memiliki pengalaman tentang pola desain ini.

Jason Evans
sumber