Pandangan saya tentang masalah ini.
Keempat pola memiliki banyak kesamaan, keempatnya kadang-kadang secara informal disebut pembungkus, atau pola pembungkus. Semua menggunakan komposisi, membungkus subjek dan mendelegasikan eksekusi ke subjek di beberapa titik, lakukan pemetaan satu pemanggilan metode ke yang lain. Mereka menghindarkan klien dari keharusan membangun objek yang berbeda dan menyalin semua data yang relevan. Jika digunakan dengan bijak, mereka menghemat memori dan prosesor.
Dengan mempromosikan kopling longgar, mereka membuat kode stabil sekali kurang terekspos terhadap perubahan yang tak terhindarkan dan lebih mudah dibaca oleh sesama pengembang.
Adaptor
Adaptor menyesuaikan subjek (adaptee) ke antarmuka yang berbeda. Dengan cara ini kita dapat menambahkan objek yang ditempatkan pada kumpulan jenis yang berbeda secara nominal.
Adaptor hanya mengekspos metode yang relevan untuk klien, dapat membatasi semua yang lain, mengungkapkan maksud penggunaan untuk konteks tertentu, seperti mengadaptasi perpustakaan eksternal, membuatnya tampak kurang umum dan lebih fokus pada kebutuhan aplikasi kami. Adaptor meningkatkan keterbacaan dan deskripsi diri dari kode kami.
Adaptor melindungi satu tim dari kode volatil dari tim lain; alat penyelamat saat berurusan dengan tim lepas pantai ;-)
Tujuan yang kurang disebutkan adalah untuk mencegah kelas subjek dari anotasi berlebih. Dengan begitu banyak kerangka kerja berdasarkan anotasi, ini menjadi penggunaan yang lebih penting dari sebelumnya.
Adaptor membantu untuk mengatasi keterbatasan Jawa hanya satu warisan. Itu dapat menggabungkan beberapa adaptee di bawah satu amplop memberikan kesan pewarisan berganda.
Dari segi kode, Adaptor “tipis”. Seharusnya tidak menambahkan banyak kode ke kelas adaptee, selain hanya memanggil metode adaptee dan sesekali konversi data yang diperlukan untuk melakukan panggilan seperti itu.
Tidak ada banyak contoh adaptor yang baik di JDK atau perpustakaan dasar. Pengembang aplikasi membuat Adapters, untuk mengadaptasi perpustakaan ke antarmuka spesifik aplikasi.
Penghias
Penghias tidak hanya mendelegasikan, tidak hanya memetakan satu metode ke metode lain, mereka melakukan lebih banyak, mereka memodifikasi perilaku beberapa metode subjek, dapat memutuskan untuk tidak memanggil metode subjek sama sekali, mendelegasikan ke objek yang berbeda, objek pembantu.
Dekorator biasanya menambahkan fungsionalitas (secara transparan) ke objek yang dibungkus seperti pencatatan, enkripsi, pemformatan, atau kompresi pada subjek. Fungsionalitas baru ini dapat membawa banyak kode baru. Karenanya, dekorator biasanya jauh lebih "gemuk" dari pada Adaptor.
Dekorator haruslah sub-kelas antarmuka subjek. Mereka dapat digunakan secara transparan, bukan pada subjeknya. Lihat BufferedOutputStream, itu masih OutputStream dan dapat digunakan seperti itu. Itu adalah perbedaan teknis utama dari Adapters.
Contoh buku teks seluruh keluarga dekorator tersedia di JDK - Java IO. Semua kelas seperti BufferedOutputStream , FilterOutputStream dan ObjectOutputStream adalah dekorator OutputStream . Mereka dapat berlapis bawang, di mana satu dekorator dihiasi lagi, menambahkan lebih banyak fungsi.
Proksi
Proxy bukan pembungkus khas. Objek yang dibungkus, subjek proxy, mungkin belum ada pada saat pembuatan proxy. Proxy sering membuatnya secara internal. Ini mungkin objek berat yang dibuat atas permintaan, atau objek jarak jauh di JVM yang berbeda atau node jaringan yang berbeda dan bahkan objek non-Jawa, komponen dalam kode asli. Tidak perlu membungkus atau mendelegasikan ke objek lain sama sekali.
Contoh paling umum adalah proksi jarak jauh, penginisialisasi objek berat, dan proksi akses.
Remote Proxy - subjek berada di server jarak jauh, JVM yang berbeda atau bahkan sistem non Java. Proxy menerjemahkan panggilan metode ke panggilan RMI / REST / SOAP atau apa pun yang diperlukan, melindungi klien dari paparan teknologi yang mendasarinya.
Lazy Load Proxy - sepenuhnya menginisialisasi objek hanya penggunaan pertama atau penggunaan intensif pertama.
Access Proxy - mengontrol akses ke subjek.
Tatapan
Fasad terkait erat dengan desain Principle of Least Knowledge (Law of Demeter). Fasad sangat mirip dengan Adaptor. Mereka berdua membungkus, mereka berdua memetakan satu objek ke yang lain, tetapi mereka berbeda dalam niat. Fasad meratakan struktur kompleks subjek, grafik objek kompleks, menyederhanakan akses ke struktur kompleks.
Fasad membungkus struktur yang kompleks, menyediakan antarmuka datar untuknya. Ini mencegah objek klien dari terkena hubungan dalam struktur subjek sehingga mempromosikan kopling longgar.
Jembatan
Varian yang lebih kompleks dari pola Adaptor di mana implementasi tidak hanya bervariasi tetapi juga abstraksi. Itu menambah satu lagi tipuan ke delegasi. Delegasi tambahan adalah jembatan. Ini memisahkan Adapter bahkan dari mengadaptasi antarmuka. Ini meningkatkan kompleksitas lebih dari yang lain dari pola pembungkus lainnya, jadi terapkan dengan hati-hati.
Perbedaan konstruktor
Perbedaan pola juga jelas ketika melihat konstruktor mereka.
Proxy tidak membungkus objek yang ada. Tidak ada subjek dalam konstruktor.
Dekorator dan Adaptor tidak membungkus objek yang sudah ada, dan biasanya
disediakan di konstruktor.
Konstruktor fasad mengambil elemen root dari keseluruhan grafik objek, jika tidak maka akan tampak sama dengan Adapter.
Contoh kehidupan nyata - JAXB Marshalling Adapter . Tujuan dari adaptor ini adalah pemetaan kelas datar sederhana ke struktur yang lebih kompleks yang diperlukan secara eksternal dan untuk mencegah "mencemari" kelas subjek dengan anotasi yang berlebihan.