Modus strategi
asal
Mode STRATEGI Delphi diperluas berdasarkan STRATEGI. Untuk informasi lebih lanjut mengenai mode STRATEGI, silakan lihat "Pola Desain Halaman 208"
Tujuan
Tentukan serangkaian algoritme, rangkum satu per satu, dan buat agar dapat dipertukarkan. Pola ini membuat algoritme tidak bergantung pada perubahan klien yang menggunakannya.
motivasi
? Strategi yang berbeda dapat diubah secara dinamis sesuai kebutuhan. ? Lebih baik merangkum beberapa perilaku dan struktur algoritma tanpa membiarkan program klien mengganggu secara langsung? Pilih metode perilaku yang benar melalui pernyataan kondisi yang relevan. Metode
Templat menggunakan pewarisan untuk mengubah bagian-bagian algoritma. Strategi menggunakan proxy dan kombinasi untuk mengubah semua algoritma dan mendukung transformasi dinamis. Di masa depan, objek konteks akan digunakan untuk mengalokasikan algoritma tertentu secara dinamis pada waktu proses. Demikian pula, dengan menggunakan objek konteks, kelas klien akan dipisahkan dari antarmuka algoritma dependen, dan antarmuka yang lebih umum dapat disediakan melalui objek konteks. Dalam pengertian yang sama, melalui antarmuka
konteks dan
strategi , algoritme terkait di seluruh sistem dapat dirancang dan disediakan di masa depan untuk mengimplementasikan aplikasi tertentu tanpa mengubah antarmuka.
Strategi juga memungkinkan Anda membuat kerangka kelas tunggal, sederhana, dan dapat dipelihara. Kerangka kelas bergantung pada warisan.
aplikasi
Pelaksanaan
Contoh berikut menghitung tingkat bunga bulanan untuk kartu kredit.
Mode strategi merangkum dan mengakses antarmuka melalui kelas abstrak unik TfinanzeCharge dan menyediakan algoritma berbeda untuk menghitung suku bunga bulanan. TregularCharge dan TPReferredCharge merangkum algoritme spesifik yang berbeda untuk penghitungan suku bunga bulanan kartu kredit. TmonthlyCharge mengimplementasikan antarmuka TcontextCharge dan mengonfigurasi objek kebijakan yang berbeda. TconntextCharge menjadi mesin lini tengah objek klien dan objek strategi, yang membantu mengurangi ketergantungan objek klien dan strategi/objek.
// Antarmuka strategi ( kelas abstrak) TFinanzeCharge = kelas publik //Mengembalikan hasil perhitungan
fungsi getCharge(const Balance: double): double // Strategi spesifik TRegularCharge = class(TFinanzeCharge) public
function getCharge(const Saldo: ganda): ganda; override akhir;
// Strategi khusus TPreferredCharge = class(TFinanzeCharge)
fungsi publik getCharge(const Balance: ganda): ganda; akhir;Program klien bergantung pada antarmuka konteks untuk menjadwalkan strategi yang ditentukan. Namun, karena antarmuka konteks dihasilkan untuk program klien, program klien harus mengetahui kebijakan/objek yang tersedia. Jika konteksnya tidak dapat mengembalikan instance yang valid, Anda dapat memilih implementasi metode dengan strategi default.
// Antarmuka konteks TChargeContext = kelas fungsi publik ComputeCharges
( const Balance: double): double virtual ; konstruktornya Contoh penghitungan suku bunga tertentu telah disiapkan.
Kelas ini bertindak sebagai mediator antara klien dan kelas strategi, dan dikonfigurasikan dengan menggunakan komposisi dan meneruskan instance biaya keuangan konkret ke konstruktornya.
TMonthlyCharges = class(TChargeContext) private FFinanzeCharge
: TFinanzeCharge; public//fungsi Antarmuka yang diakses oleh program klien ComputeCharges(const Balance: double
) : double; Hancurkan; timpa; akhir;---implementasi
// fungsi TRegularCharge TRegularCharge.getCharge(const Balance: double): double;begin result := Balance * (REG_RATE / 12);end
// fungsi TPreferredCharge TPreferredCharge.getCharge(const Balance: double): double;begin // ini bisa jadi rumit algoritma yang memperhitungkan // pola pembelian pemegang kartu kredit dan akumulasi poin reward. result := Balance * (PREFERRED_RATE / 12);end
; Konteks // Konstruktor TMonthlyCharges TMonthlyCharges.Create(aFinanzeCharge: TFinanzeCharge);begin mewarisi Create; // aFinanzeCharge mengonfigurasi objek konteks // kelas ini mengambil kepemilikan aFinanzeCharge (akan menghancurkannya) FFinanzeCharge := aFinanzeCharge;end;destructor TMonthlyCharges.Destroy; mulai FFinanzeCharge.Gratis; Hancurkan;akhir;fungsi TMonthlyCharges.ComputeCharges(Saldo konstan: ganda): ganda;mulai hasil := FFinanzeCharge.getCharge(Balance);end;
Contoh Delphi