Saya mencoba memahami pola strategi dan bertanya pada diri sendiri: apakah kelas konteks harus dimiliki atau dapatkah saya tinggalkan tanpa mengganggu tujuan pola?
Saya mendapat kesan bahwa saya memerlukan semacam saklar untuk membaca berbagai jenis file tetapi tidak ingin meretas sesuatu dan kemudian berurusan dengan refactoring (walaupun, tentu saja selalu terjadi bahwa kode dapat di refactored tetapi idenya adalah: coba menjadi sepintar mungkin dalam desain sebelumnya ...):
Gambar diambil dari wikimedia
Bisakah klien mendelegasikan secara langsung ke antarmuka Strategi atau ada sesuatu yang saya lewatkan untuk mengerti tentang kelas konteks?
interface Reader {
// read information from file and fill data list field of Client
readFile();
}
class ExcelReader implements Reader{ /* */ }
class PdfReader implements Reader{ /* */}
class Client{
// strategic choice
Reader r;
// data list field
List<Data> data;
// Client Constructor
public Client(){
if(<file ends in .xls>)
r = new ExcelReader();
else
r = new PdfReader();
r.readFile();
}
}
Jadi, yang digambarkan di atas adalah konteks kelas yang hilang. Apakah kode mematuhi pola strategi?
design-patterns
strategy
panny
sumber
sumber
Jawaban:
Dalam contoh Anda, panggilan kode
readFile
adalah bagian dari konstruktor Klien. Metode itu adalah "konteks" yang Anda cari . Pola strategi tidak memerlukan "kelas konteks" secara harfiah, dan pada versi pertama kode Anda objek strategi ("Pembaca" dalam kasus Anda) dapat berada hanya dalam variabel lokal. Terutama ketika hanya ada satu "metode strategis" ("readFile") untuk dipanggil.Namun, jika basis kode Anda tumbuh dari satu versi ke versi berikutnya, bukan tidak mungkin semakin banyak metode "strategis" dipanggil, dan keputusan strategi mana yang akan diterapkan dan pelaksanaan "metode strategis" akan terjadi pada waktu yang berbeda. dan di berbagai tempat dalam kode Anda. Jadi Anda mulai memperbaiki mereka untuk menjaga logika di satu tempat. Ini akan mengarah langsung ke implementasi yang mirip dengan diagram di pertanyaan Anda.
sumber
Pasti. Pola hanyalah pedoman. Anda masih perlu beradaptasi dan menerapkannya dengan benar untuk masalah yang dihadapi. Secara pribadi, saya jarang pernah membiarkan strategi diatur pada saat runtime; lebih sering ditentukan pada konstruksi atau diputar di pabrik.
Padahal bisa juga diperdebatkan bahwa
setStrategy
itu pribadi dan injeksi saya hanya menggunakan pola seperti yang ditunjukkan.sumber