Pola Desain Strategi Yang Dimodifikasi

11

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).

Megan Walker
sumber
Parameter opsional seperti di C ++ tidak akan menyelesaikan masalah apa pun, karena hanya merupakan singkatan untuk mendefinisikan beberapa metode kelebihan beban.
maaartinus
Saya akan berusaha keras untuk menghindari menyimpan parameter tambahan di suatu tempat di mana saya harus mengubahnya sebelum digunakan. Dengan cara ini Anda membuat ConcreteAlgorithm stateful, sehingga tidak dapat diteruskan dengan mudah ke metode atau utas lainnya. Selain itu, terlalu mudah untuk lupa mengatur parameter.
maaartinus

Jawaban:

5

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

StrategyParameter //Base strategy parameter that most of the strategies need
        ^
        |
        |
SpecialStrategyParameter // will be used for strategies that need more parameter

Dan kemudian, tetapkan hierarki strategi seperti:

Interface MyStrategy {
   void myStrategyMethod(StrategyParameter parameter);
}

class MyNormalStrategy extends MyStrategy {
   void myStrategyMethod(StrategyParameter parameter) {
       //implement the logic here
   }
}

sebut strategi di atas sebagai: myNormalStrategyInstance.myStrategyMethod(strategyParameter);

class MySpecializedStrategy extends MyStrategy {
   void myStrategyMethod(StrategyParameter parameter) {
       //implement the logic here
   }
}

panggil strategi di atas dengan memberikan SpecialStrategyParametercontoh seperti:mySpecializedStrategy.myStrategyMethod(specialStrategyParameter);

Harap perbarui jika ada sesuatu yang tidak jelas. Dengan senang hati akan menjelaskan / mengklarifikasi.

peakit
sumber
2
-1 membutuhkan downcast, memecah enkapsulasi desain. Meskipun ini merupakan peningkatan pada desain dalam pertanyaan, ada cara yang lebih baik untuk menguliti kucing ini.
tallseth
@tallseth saya melihat downcast juga. Tapi saya tidak melihat cara yang lebih baik. Bisakah Anda menunjukkan solusi yang lebih baik? Artikel atau sesuatu?
Narek
Sebenarnya ya. @ Jordão memiliki jawaban yang saya inginkan, berdasarkan perincian yang kami miliki dalam pertanyaan. Jawaban itu memainkan kekuatan pola strategi. Jika kita menggunakan pendekatan dalam jawaban ini, saya ingin StrategyParametermemuat 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.
tallseth
4

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:

interface Strategy {
  int calculate();
}

class ConcreteStrategyThatNeedsAParameter implements Strategy {
  private final int param;
  public ConcreteStrategyThatNeedsAParameter(int param) {
    this.param = param;
  }
  public int calculate() { 
    // uses param...
  }
}

Sekarang, seseorang masih perlu membuat instance kelas ini dan meneruskannya ke klien Anda. Tetapi klien Anda masih hanya perlu tahu tentang Strategyantarmuka.

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.

Jordão
sumber
Klien adalah orang yang memiliki konteks untuk menyediakan parameter.
andyczerwonka
1

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.

Ian
sumber
0

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
0

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.

pjv
sumber