Apakah pewarisan konteks, seperti yang ditunjukkan oleh contoh Bebek Pola Desain Kepala Pertama, tidak relevan dengan pola strategi?


10

Dalam Head First Design Patterns, ia mengajarkan pola strategi dengan menggunakan contoh Bebek di mana subclass Bebek yang berbeda dapat ditugaskan perilaku tertentu saat runtime. Dari pemahaman saya tujuan dari pola strategi adalah untuk mengubah perilaku objek tunggal saat runtime, namun mereka menggunakan warisan Bebek untuk mengubah perilaku berbagai jenis Bebek.

Pola Strategi

Relevansi?

Apakah konteks pewarisan Bebek tidak relevan dengan pola strategi atau apakah beragam jenis Bebek dan juga memvariasikan perilaku mereka merupakan alasan yang baik untuk menggunakan pola strategi? Apakah situasi di mana Anda perlu memvariasikan keduanya merupakan alasan yang baik untuk menggunakan pola strategi? Mengapa mereka memasukkan ini sebagai contoh pola strategi?

Contoh Sederhana

Bisakah saya lebih menyederhanakan contoh ini dengan hanya memiliki kelas Bebek (tidak ada kelas turunan)? Kemudian ketika menerapkan satu objek bebek itu dapat ditugaskan perilaku yang berbeda berdasarkan keadaan tertentu yang tidak tergantung pada jenis objeknya sendiri. Misalnya: Perubahan FlyBehavior berdasarkan cuaca atau perubahan QuackBehavior berdasarkan waktu hari atau seberapa lapar bebek. Saya menyadari ini akan memecahkan masalah yang berbeda dari yang ada di buku ini, tetapi apa yang saya cari adalah contoh pola strategi yang relevan untuk kembali.

Apakah contoh saya di atas merupakan pola strategi juga?

Edit:

Saya berhasil menemukan 2 contoh pola strategi sederhana yang lebih ketat menjadi pola strategi tanpa pewarisan konteks: Hunter.java dan solver.py .

Jawaban:


7

Ya, saya pikir Anda berada di jalur yang benar. Kelas yang menggunakan pola strategi tidak harus menjadi subclass. Pola strategi adalah alternatif pewarisan untuk penggunaan kembali kode. Ini kembali ke perbandingan yang lebih luas dari pewarisan vs.

Dari Pola Desain: Elemen Reusable OOP Anda akan menggunakan pola strategi untuk

  • Hindari ledakan subclass (karena kombinasi perilaku)
  • Jika Anda perlu menukar perilaku saat run-time

Jika Anda menggunakan warisan untuk menerapkan perilaku Quack and Fly, Anda akan menghasilkan semua subclass ini untuk mewakili semua kombinasi perilaku.

  • FlyableQuackableDuck
  • FlyableSqeakableDuck
  • FlyableMuteDuck
  • NoFlyQuackableDuck
  • NoFlySqueakableDuck
  • NoFlyMuteDuck

Memiliki begitu banyak subclass membuatnya lebih sulit untuk dipertahankan karena itulah pola strategi disukai dalam kasus ini. Anda hanya perlu dua properti yang merangkum Flyability dan Quackability dan Anda dapat mencampur dan mencocokkan ini tanpa membuat kelas baru.

Anda juga sudah menyebutkan manfaat run-time jika cuaca mengubah properti Fly bebek dapat diganti dengan objek NoFly karena kondisinya.

Ini konsisten dengan saran untuk mendukung komposisi daripada warisan jika memungkinkan.


1

Bisakah saya lebih menyederhanakan contoh ini dengan hanya memiliki kelas Bebek (tidak ada kelas turunan)? Kemudian ketika menerapkan satu objek bebek itu dapat ditugaskan perilaku yang berbeda berdasarkan keadaan tertentu yang tidak tergantung pada jenis objeknya sendiri.

Pasti. Untuk inspirasi lihat di Head First Object-Oriented Analysis and Design . Ada "Rick's Guitars" yang menunjukkan ledakan sub-kelas Instrumen (musikal) . Untuk memperbaiki ini semua perilaku yang bervariasi dibungkus dalam kelas "spesifikasi", mengamati prinsip merangkum apa yang bervariasi .

Abstrak Pabrik - Konstruksi Berbasis Konteks

Ini polanya . BTW, perhatikan bahwa ia menggunakan strategi itu sendiri.

Berfokus pada konsep, bukan implementasi ... Anda mungkin memiliki "WeatherFactory" yang membuat objek spesifikasi berdasarkan kondisi cerah atau hujan, dll.

Anda dapat memiliki "pabrik-pabrik pabrik" untuk dapat membangun benda-benda "NoFlyInFogQuackableMallard". Dan memang, inilah pola Pabrik Abstrak. Jadi mungkin DuckFactory untuk membuat bebek tipe umum, lalu WeatherFactory untuk memberikannya perilaku cuaca berkabut tipe bebek spesifik.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.