Saya sudah mulai melihat ke Pola Desain baru-baru ini, dan satu hal yang saya koding akan cocok dengan pola Strategi dengan sempurna, kecuali untuk satu perbedaan kecil.
Pada dasarnya, beberapa (tetapi tidak semua) dari algoritma saya, memerlukan satu atau dua parameter tambahan yang diteruskan ke mereka.
Jadi saya juga perlu
- berikan parameter tambahan saat saya memanggil metode perhitungan mereka
atau
- menyimpannya sebagai variabel di dalam kelas ConcreteAlgorithm, dan dapat memperbaruinya sebelum saya memanggil algoritma.
Apakah ada pola desain untuk kebutuhan ini / Bagaimana saya bisa menerapkan ini sambil tetap berpegang pada Pola Strategi?
Saya telah mempertimbangkan untuk melewatkan objek klien ke semua algoritma, dan menyimpan variabel di sana, lalu menggunakannya hanya ketika algoritma tertentu membutuhkannya. Namun, saya pikir ini sulit, dan mengalahkan titik pola strategi.
Untuk lebih jelasnya saya menerapkan di Jawa, dan jadi tidak memiliki kemewahan parameter opsional (yang akan menyelesaikan ini dengan baik).
sumber
Jawaban:
Samuel, mungkinkah untuk merangkum parameter yang masing-masing strategi ambil ke dalam satu kelas bersama dan kemudian memperluas kelas Parameter umum itu untuk menambahkan lebih banyak perilaku yang dibutuhkan beberapa strategi Anda secara spesifik?
Misalnya
Dan kemudian, tetapkan hierarki strategi seperti:
sebut strategi di atas sebagai:
myNormalStrategyInstance.myStrategyMethod(strategyParameter);
panggil strategi di atas dengan memberikan
SpecialStrategyParameter
contoh seperti:mySpecializedStrategy.myStrategyMethod(specialStrategyParameter);
Harap perbarui jika ada sesuatu yang tidak jelas. Dengan senang hati akan menjelaskan / mengklarifikasi.
sumber
StrategyParameter
memuat semua param yang mungkin, seperti halnya DTO. Beberapa implementasi strategi dapat mengabaikannya. Dalam beberapa kasus, itu adalah pendekatan terbaik. Konteks adalah raja untuk masalah semacam ini.Anda perlu menjelaskan strategi Anda .
Itu semua tergantung pada bagaimana Anda menggunakan algoritma Anda. Agar kelas klien Anda menggunakan implementasi strategi yang berbeda secara bergantian, mereka semua harus memiliki abstraksi yang sama . Jika mereka tidak mengikuti antarmuka yang sama, mungkin yang Anda butuhkan adalah abstraksi yang berbeda .
Saya telah menggunakan strategi yang dapat dikonfigurasi sebelumnya, di mana Anda mengukur parameter kelas beton pada konstruksi:
Sekarang, seseorang masih perlu membuat instance kelas ini dan meneruskannya ke klien Anda. Tetapi klien Anda masih hanya perlu tahu tentang
Strategy
antarmuka.Ini juga berfungsi jika metode strategi Anda mengambil parameter, tetapi kemudian klien Anda tahu tentang parameter itu dan meneruskannya ke semua implementasi yang bekerja dengannya.
sumber
Selama tanda tangan didefinisikan pada antarmuka dengan jelas, itu masih sesuai dengan pola Strategi.
Pola-pola seperti yang tertulis adalah bentuk absolut yang paling sederhana yang masih menunjukkan perilaku yang diharapkan, sehingga Anda dapat mempercantiknya selama Anda mempertahankan niat aslinya. Itu tentu saja dengan asumsi Anda ingin mengikuti polanya. Tidak ada gunanya menggunakan pola jika tidak cocok, atau hanya karena ada di sana, tetapi dalam kasus Anda saya pikir Anda baik-baik saja.
sumber
memperluas jawaban di atas yang disediakan oleh peakit - Anda dapat menggunakan abstraksi. Saya menggunakan kode peakit di sini -
Antarmuka MyStrategy { abstrak void myStrategyMethod (parameter StrategyParameter); }
class MyNormalStrategy memperluas MyStrategy {public override membatalkan myStrategyMethod (parameter StrategyParameter) {// menerapkan logika di sini}}
kelas MySpecializedStrategy memperluas MyStrategy {public override membatalkan myStrategyMethod (parameter StrategyParameter, ExtraPrategeter ExtraParameter, extraParameter) {// menerapkan logika di sini} }
Jika saya memahami pertanyaan Anda dengan benar, Anda ingin memberikan parameter tambahan ke algoritme tertentu, bukan? Tolong beri tahu saya jika ini yang Anda cari?
sumber
Jika Anda melihat ke dalam buku pola desain, itu tidak salah bahwa beberapa SimpleStrategy ada yang menggunakan kurang atau tidak ada parameter yang diteruskan, atau bahwa parameter adalah satu-ukuran-cocok-untuk-semua / paling tidak-umum-pengali. Pilihan desain di sini adalah apakah ini menyakitkan bagi Anda dalam hal pemrosesan ekstra yang akhirnya tidak digunakan.
sumber