Adakah yang pernah menggunakan Pola Jembatan dalam aplikasi dunia nyata? Jika demikian, bagaimana Anda menggunakannya? Apakah ini saya, atau hanya Pola Adaptor dengan sedikit ketergantungan injeksi yang dimasukkan ke dalam campuran? Apakah itu benar-benar pantas mendapatkan polanya sendiri?
design-patterns
adapter
bridge
Charles Graham
sumber
sumber
Jawaban:
Contoh klasik dari pola Bridge digunakan dalam definisi bentuk di lingkungan UI (lihat entri Wikipedia pola jembatan ). Pola Bridge adalah gabungan dari pola Template dan Strategi .
Ini adalah pandangan umum beberapa aspek dari pola Adaptor dalam pola Bridge. Namun, mengutip dari artikel ini :
sumber
Ada kombinasi jawaban Federico dan John .
Kapan:
Refactor ke:
sumber
Pola Bridge adalah aplikasi dari saran lama, "lebih suka komposisi daripada warisan". Ini menjadi berguna ketika Anda harus mensubklasifikasikan waktu yang berbeda dengan cara yang ortogonal satu sama lain. Katakanlah Anda harus menerapkan hierarki bentuk berwarna. Anda tidak akan membentuk subclass Shape dengan Rectangle dan Circle dan kemudian subclass Rectangle dengan RedRectangle, BlueRectangle dan GreenRectangle dan sama untuk Circle, bukan? Anda lebih suka mengatakan bahwa setiap Bentuk memiliki Warna dan menerapkan hierarki warna, dan itu adalah Pola Jembatan. Yah, saya tidak akan menerapkan "hierarki warna", tetapi Anda mendapatkan ide ...
sumber
Kapan:
Refactor ke:
sumber
Adaptor dan Jembatan tentu terkait, dan perbedaannya halus. Ada kemungkinan bahwa beberapa orang yang berpikir mereka menggunakan salah satu pola ini sebenarnya menggunakan pola yang lain.
Penjelasan yang saya lihat adalah Adaptor digunakan ketika Anda mencoba menyatukan antarmuka beberapa kelas yang tidak kompatibel yang sudah ada . Adaptor berfungsi sebagai semacam penerjemah untuk implementasi yang dapat dianggap sebagai warisan .
Sedangkan pola Bridge digunakan untuk kode yang lebih cenderung menjadi greenfield. Anda sedang merancang Jembatan untuk menyediakan antarmuka abstrak untuk implementasi yang perlu beragam, tetapi Anda juga mendefinisikan antarmuka kelas implementasi tersebut.
Driver perangkat adalah contoh yang sering dikutip dari Bridge, tapi saya akan mengatakan itu Bridge jika Anda mendefinisikan spesifikasi antarmuka untuk vendor perangkat, tetapi itu adalah Adaptor jika Anda mengambil driver perangkat yang ada dan membuat kelas wrapper untuk menyediakan antarmuka terpadu.
Jadi kode-bijaksana, kedua pola ini sangat mirip. Dari segi bisnis, mereka berbeda.
Lihat juga http://c2.com/cgi/wiki?BridgePattern
sumber
Dalam pengalaman saya, Bridge adalah pola yang cukup sering berulang, karena itu solusi setiap kali ada dua dimensi ortogonal dalam domain . Misalnya bentuk dan metode menggambar, perilaku dan platform, format file dan serializers dan sebagainya.
Dan sebuah saran: selalu pikirkan pola desain dari perspektif konseptual , bukan dari perspektif implementasi. Dari sudut pandang yang benar, Bridge tidak dapat disamakan dengan Adaptor, karena mereka menyelesaikan masalah yang berbeda, dan komposisi lebih unggul daripada warisan bukan karena kepentingan itu sendiri, tetapi karena memungkinkan untuk menangani masalah ortogonal secara terpisah.
sumber
Maksud dari Bridge dan Adaptor berbeda dan kita membutuhkan kedua pola secara terpisah.
Pola jembatan:
Gunakan pola Jembatan saat:
@ John Sonmez menjawab dengan jelas menunjukkan efektivitas pola jembatan dalam mengurangi hirarki kelas.
Anda dapat merujuk ke tautan dokumentasi di bawah ini untuk mendapatkan wawasan yang lebih baik tentang pola jembatan dengan contoh kode
Pola adaptor :
Perbedaan utama:
Pertanyaan SE terkait dengan diagram UML dan kode kerja:
Perbedaan antara pola Bridge dan pola Adaptor
Artikel yang berguna:
artikel tentang pola pembuatan jembatan
pembuatan sumber pola artikel adaptor
artikel pola jembatan journaldev
EDIT:
Bridge Pattern contoh dunia nyata (Sesuai saran meta.stackoverflow.com, masukkan contoh situs dokumentasi dalam posting ini karena dokumentasi akan terbenam di matahari)
Pola jembatan memisahkan abstraksi dari implementasi sehingga keduanya dapat bervariasi secara independen. Itu telah dicapai dengan komposisi daripada warisan.
Jembatan pola UML dari Wikipedia:
Anda memiliki empat komponen dalam pola ini.
Abstraction
: Ini mendefinisikan sebuah antarmukaRefinedAbstraction
: Ini mengimplementasikan abstraksi:Implementor
: Ini mendefinisikan antarmuka untuk implementasiConcreteImplementor
: Ini mengimplementasikan antarmuka Implementor.The crux of Bridge pattern :
Dua hierarki kelas ortogonal menggunakan komposisi (dan tidak ada warisan). Hirarki Abstraksi dan Implementasi hierarki dapat bervariasi secara independen. Implementasi tidak pernah merujuk Abstraksi. Abstraksi berisi antarmuka Implementasi sebagai anggota (melalui komposisi). Komposisi ini mengurangi satu tingkat hierarki warisan.Kasus penggunaan kata asli:
Aktifkan kendaraan yang berbeda untuk memiliki kedua versi sistem manual dan auto gear.
Kode contoh:
keluaran:
Penjelasan:
Vehicle
adalah abstraksi.Car
danTruck
dua implementasi konkret dariVehicle
.Vehicle
mendefinisikan metode abstrak:addGear()
.Gear
adalah antarmuka implementorManualGear
danAutoGear
dua implementasi dariGear
Vehicle
mengandungimplementor
antarmuka daripada mengimplementasikan antarmuka.Compositon
antarmuka implementor adalah inti dari pola ini: Memungkinkan abstraksi dan implementasi bervariasi secara independen.Car
danTruck
mendefinisikan implementasi (abstraksi ulang) untuk abstraksiaddGear()
:: Ini berisiGear
- EntahManual
atauAuto
Gunakan case untuk pola Bridge :
sumber
Saya telah menggunakan pola jembatan di tempat kerja. Saya memprogram dalam C ++, di mana sering disebut idiom PIMPL (pointer ke implementasi). Ini terlihat seperti ini:
Dalam contoh ini
class A
berisi antarmuka, danclass Aimpl
berisi implementasinya.Satu kegunaan untuk pola ini adalah untuk mengekspos hanya beberapa anggota publik dari kelas implementasi, tetapi tidak yang lain. Dalam contoh hanya
Aimpl::foo()
dapat dipanggil melalui antarmuka publikA
, tetapi tidakAimpl::bar()
Keuntungan lain adalah bahwa Anda dapat menentukan
Aimpl
dalam file header terpisah yang tidak perlu dimasukkan oleh penggunaA
. Yang harus Anda lakukan adalah menggunakan deklarasi majuAimpl
sebelumA
didefinisikan, dan memindahkan definisi dari semua fungsi anggota yang merujukpImpl
ke file .cpp. Ini memberi Anda kemampuan untuk menjagaAimpl
tajuk pribadi, dan mengurangi waktu kompilasi.sumber
Untuk memasukkan contoh bentuk dalam kode:
Outputnya adalah:
Perhatikan kemudahan dengan warna dan bentuk baru yang dapat ditambahkan ke sistem tanpa menyebabkan ledakan subkelas karena permutasi.
sumber
bagi saya, saya menganggapnya sebagai mekanisme di mana Anda dapat bertukar antarmuka. Di dunia nyata Anda mungkin memiliki kelas yang dapat menggunakan lebih dari satu antarmuka, Bridge memungkinkan Anda bertukar.
sumber
Anda bekerja untuk perusahaan asuransi tempat Anda mengembangkan aplikasi alur kerja yang mengelola berbagai jenis tugas: akuntansi, kontrak, klaim. Ini adalah abstraksi. Di sisi implementasi, Anda harus dapat membuat tugas dari berbagai sumber: email, faks, e-messaging.
Anda memulai desain Anda dengan kelas-kelas ini:
Sekarang, karena setiap sumber harus ditangani dengan cara tertentu, Anda memutuskan untuk mengkhususkan setiap jenis tugas:
Anda berakhir dengan 13 kelas. Menambahkan jenis tugas atau jenis sumber menjadi menantang. Menggunakan pola jembatan menghasilkan sesuatu yang lebih mudah untuk dipelihara dengan memisahkan tugas (abstraksi) dari sumber (yang merupakan masalah implementasi):
Menambahkan jenis tugas atau sumber sekarang jauh lebih mudah.
Catatan: Sebagian besar pengembang tidak akan membuat hierarki 13 kelas di muka untuk menangani masalah ini. Namun, dalam kehidupan nyata, Anda mungkin tidak tahu sebelumnya jumlah sumber dan jenis tugas; jika Anda hanya memiliki satu sumber dan dua jenis tugas, Anda mungkin tidak akan memisahkan tugas dari Sumber. Kemudian, kompleksitas keseluruhan bertambah ketika sumber dan jenis tugas baru ditambahkan. Pada titik tertentu, Anda akan melakukan refactor dan, paling sering, berakhir dengan solusi seperti jembatan.
sumber
sumber