Saya tidak mengerti pola desain "jembatan" sama sekali. Saya telah melalui berbagai situs web, tetapi mereka belum membantu.
Adakah yang bisa membantu saya dalam memahami hal ini?
Saya tidak mengerti pola desain "jembatan" sama sekali. Saya telah melalui berbagai situs web, tetapi mereka belum membantu.
Adakah yang bisa membantu saya dalam memahami hal ini?
Jawaban:
Dalam OOP kami menggunakan polimorfisme sehingga abstraksi dapat memiliki beberapa implementasi. Mari kita lihat contoh berikut:
Persyaratan baru diperkenalkan dan perlu membawa perspektif percepatan kereta, jadi ubah kode seperti di bawah ini.
Kode di atas tidak dapat dipertahankan dan kurang dapat digunakan kembali (dengan asumsi kita dapat menggunakan kembali mekanisme akselerasi untuk platform trek yang sama). Kode berikut menerapkan pola jembatan dan memisahkan dua abstraksi yang berbeda, transportasi kereta api dan akselerasi .
sumber
Monorail
karena itu bukan dua kata, itu kata tunggal (gabungan). MonoRail akan menjadi beberapa subclass dari Rail alih-alih jenis rail yang berbeda (seperti itu). Sama seperti kita tidak akan menggunakanSunShine
atauCupCake
, mereka akanSunshine
danCupcake
Sementara sebagian besar pola desain memiliki nama yang membantu, saya menemukan nama "Bridge" menjadi non-intuitif dalam hal apa yang dilakukannya.
Secara konseptual, Anda mendorong detail implementasi yang digunakan oleh hierarki kelas ke objek lain, biasanya dengan hierarki sendiri. Dengan melakukannya, Anda menghilangkan ketergantungan yang ketat pada detail implementasi tersebut dan memungkinkan detail implementasi tersebut berubah.
Dalam skala kecil, saya menyamakan ini dengan penggunaan pola strategi dalam cara Anda bisa memasukkan perilaku baru. Tetapi alih-alih hanya membungkus suatu algoritma seperti yang sering terlihat dalam suatu strategi, objek implementasi biasanya lebih dipenuhi fitur. Dan ketika Anda menerapkan konsep itu ke seluruh hierarki kelas, pola yang lebih besar menjadi Jembatan. (Sekali lagi, benci nama itu).
Ini bukan pola yang akan Anda gunakan setiap hari, tapi saya merasa terbantu ketika mengelola potensi ledakan kelas yang bisa terjadi ketika Anda memiliki (jelas) kebutuhan akan pewarisan berganda.
Ini adalah contoh dunia nyata:
Saya memiliki alat RAD yang memungkinkan Anda menjatuhkan dan mengonfigurasi kontrol pada permukaan desain, jadi saya memiliki model objek seperti ini:
Dan seterusnya, mungkin dengan selusin kontrol.
Tapi kemudian persyaratan baru ditambahkan untuk mendukung banyak tema (lihat-n-terasa). Katakanlah kita memiliki tema-tema berikut:
Win32
,WinCE
,WinPPC
,WinMo50
,WinMo65
. Setiap tema akan memiliki nilai atau implementasi yang berbeda untuk operasi terkait rendering seperti DefaultFont, DefaultBackColor, BorderWidth, DrawFrame, DrawScrollThumb, dll.Saya bisa membuat model objek seperti ini:
dll, untuk satu tipe kontrol
dll., untuk setiap jenis kontrol lainnya (lagi)
Anda mendapatkan idenya — Anda mendapatkan ledakan kelas # widget kali # tema. Ini menyulitkan perancang RAD dengan membuatnya sadar akan setiap tema. Plus, menambahkan tema baru memaksa perancang RAD untuk dimodifikasi. Lebih lanjut, ada banyak implementasi bersama dalam suatu tema yang akan bagus untuk diwariskan, tetapi kontrol sudah mewarisi dari basis bersama (
Widget
).Jadi alih-alih yang saya lakukan adalah membuat hierarki objek terpisah yang mengimplementasikan tema. Setiap widget akan menyimpan referensi ke objek yang mengimplementasikan operasi rendering. Dalam banyak teks, kelas ini diberi akhiran dengan
Impl
tapi saya menyimpang dari konvensi penamaan itu.Jadi sekarang
TextboxWidget
penampilan saya seperti ini:Dan saya bisa membuat pelukis saya mewarisi basis tema khusus saya, yang tidak bisa saya lakukan sebelumnya:
Salah satu hal yang menyenangkan adalah bahwa saya dapat secara dinamis memuat implementasi pada saat run-time, memungkinkan saya untuk menambahkan sebanyak mungkin tema yang saya inginkan tanpa mengubah perangkat lunak inti. Dengan kata lain, "implementasi saya dapat bervariasi terlepas dari abstraksi".
sumber
Win32TextboxPainter
danWin32ListPainter
dariWin32WidgetPainter
. Anda dapat memiliki pohon warisan di sisi pelaksanaan, tetapi harus lebih generik (mungkinStaticStyleControlPainter
,EditStyleControlPainter
danButtonStyleControlPainter
) dengan operasi primitif yang dibutuhkan diganti sesuai kebutuhan. Ini lebih dekat dengan kode asli yang saya mendasarkan contoh.Jembatan bermaksud memisahkan satu abstraksi dari implementasi konkretnya , sehingga keduanya dapat berbeda secara independen:
Jembatan mencapai ini dengan menggunakan komposisi:
Keterangan tambahan tentang kebingungan yang sering terjadi
Pola ini sangat mirip dengan pola adaptor: abstraksi menawarkan antarmuka yang berbeda untuk implementasi dan menggunakan komposisi untuk melakukannya. Tapi:
Dalam buku mani yang luar biasa tentang pola desain ini, penulis juga mengamati bahwa:
sumber