Tentu, tetapi kami menyebutnya komposisi dan delegasi . Pola Strategi dan Injeksi Ketergantungan mungkin tampak serupa secara struktural tetapi niat mereka berbeda.
Pola Strategi memungkinkan modifikasi perilaku runtime di bawah antarmuka yang sama. Saya bisa memberi tahu bebek mallard untuk terbang dan melihatnya terbang dengan sayap. Kemudian tukarkan dengan bebek pilot jet dan saksikan ia terbang dengan maskapai Delta. Melakukan itu ketika program sedang berjalan adalah hal Pola Strategi.
Dependency Injection adalah teknik untuk menghindari ketergantungan pengkodean keras sehingga mereka dapat berubah secara mandiri tanpa mengharuskan klien untuk dimodifikasi ketika mereka berubah. Klien hanya mengungkapkan kebutuhan mereka tanpa mengetahui bagaimana mereka akan dipenuhi. Jadi bagaimana mereka bertemu diputuskan di tempat lain (biasanya di utama). Anda tidak perlu dua bebek untuk menggunakan teknik ini. Hanya sesuatu yang menggunakan bebek tanpa mengetahui atau peduli bebek mana. Sesuatu yang tidak membangun bebek atau mencarinya tetapi sangat senang menggunakan bebek apa pun yang Anda berikan.
Jika saya memiliki kelas bebek beton saya bisa menerapkannya perilaku terbang. Saya bahkan dapat mengubah perilaku dari terbang-dengan-sayap ke terbang-dengan-Delta berdasarkan variabel negara. Variabel itu bisa berupa boolean, int, atau bisa juga FlyBehavior
yang memiliki fly
metode yang melakukan gaya terbang apa pun tanpa saya harus mengujinya dengan if. Sekarang saya bisa mengubah gaya terbang tanpa mengubah jenis bebek. Sekarang Mallard bisa menjadi pilot. Ini adalah komposisi dan delegasi . Bebek ini terdiri dari FlyBehavior dan dapat mendelegasikan permintaan terbang ke sana. Anda dapat mengganti semua perilaku bebek sekaligus atau menahan sesuatu untuk setiap perilaku atau kombinasi di antaranya.
Ini memberi Anda semua kekuatan yang sama yang dimiliki warisan kecuali satu. Inheritance memungkinkan Anda mengekspresikan metode Duck apa yang Anda timpa dalam subtipe Bebek. Komposisi dan delegasi mengharuskan Bebek untuk secara eksplisit mendelegasikan subtipe dari awal. Ini jauh lebih fleksibel tetapi melibatkan lebih banyak mengetik keyboard dan Duck harus tahu itu terjadi.
Namun, banyak orang percaya bahwa warisan harus dirancang secara eksplisit sejak awal. Dan jika belum, Anda harus menandai kelas Anda sebagai disegel / final untuk melarang pewarisan. Jika Anda mengambil pandangan itu maka warisan benar-benar tidak memiliki keunggulan dibandingkan komposisi dan delegasi. Karena dengan cara apa pun Anda harus merancang ekstensibilitas dari awal atau bersedia meruntuhkannya nanti.
Meruntuhkan segalanya sebenarnya adalah pilihan populer. Perlu diketahui bahwa ada kasus di mana itu menjadi masalah. Jika Anda secara mandiri menggunakan pustaka atau modul kode yang tidak ingin Anda perbarui dengan rilis berikutnya, Anda bisa terjebak berurusan dengan versi kelas yang tidak tahu apa-apa tentang apa yang sedang Anda lakukan sekarang.
Meskipun Anda bersedia meruntuhkannya nanti dapat membebaskan Anda dari mendesain berlebihan, ada sesuatu yang sangat kuat untuk bisa mendesain sesuatu yang menggunakan bebek tanpa harus tahu apa yang sebenarnya akan dilakukan bebek ketika digunakan. Tidak mengetahui itu adalah hal yang kuat. Ini memungkinkan Anda berhenti memikirkan bebek untuk sementara waktu dan memikirkan sisa kode Anda.
"Bisakah kita" dan "haruskah kita" adalah pertanyaan yang berbeda. Nikmat Komposisi daripada Warisan tidak mengatakan tidak pernah menggunakan warisan. Masih ada kasus-kasus di mana warisan paling masuk akal. Saya akan menunjukkan kepada Anda contoh favorit saya :
public class LoginFailure : System.ApplicationException {}
Warisan memungkinkan Anda membuat pengecualian dengan nama deskriptif yang lebih spesifik hanya dalam satu baris.
Coba lakukan itu dengan komposisi dan Anda akan mendapatkan kekacauan. Juga, tidak ada risiko masalah warisan yo-yo karena tidak ada data atau metode di sini untuk menggunakan kembali dan mendorong rantai pewarisan. Semua ini menambahkan adalah nama yang bagus. Jangan pernah meremehkan nilai nama baik.
Duckbehavior.quackBehavior
dan bidang lain dalam kode Anda?