Pola Desain Strategi
Pola Desain Strategi ngidini sampeyan nemtokake kulawarga algoritma, mbungkus saben lan nggawe bisa diijolake.
Kode klien ( kelas utama ) bakal bisa milih algoritma ( layanan ) ing wektu eksekusi.
Ing artikel iki kita bakal nliti luwih jero babagan Pola Desain Strategi PHP Laravel, kalebu conto
Strategi Pola Desain
Il Strategi Pola Desain tumiba ing kategori saka pola tingkah laku lan ngidini pilihan saka algoritma ing wektu mbukak. Iki utamané migunani ing kahanan ngendi sampeyan pengin mbosenke ngalih ing antarane algoritma marang liyane utawa saka prilaku siji menyang liyane.
Ing konteks saka Laravel/PHP, pola Strategy ngijini sampeyan kanggo decouple algoritma tartamtu saka klien, ngijini sampeyan kanggo gampang ngalih ing antarane. Pendekatan iki tundhuk karo Prinsip Terbuka/Tertutup (salah siji saka Prinsip ALONED ), ngidini kode mbukak kanggo ekstensi nanging ditutup kanggo modifikasi.
Masalah
Ing akeh aplikasi Laravel, ana skenario ing ngendi sawetara algoritma utawa prilaku kudu dileksanakake adhedhasar kondisi runtime. Contone:
sampeyan duwe app ing ngendi pangguna bisa ndhaptar lan nggunakake layanan sampeyan. Saiki, jelas, sampeyan pengin nglindhungi aplikasi saka akun palsu. Salah siji cara kanggo nindakake iki yaiku nyegah registrasi:
- Email palsu
- Email sauntara utawa nggunakake siji
- Email ora sah ( email sing katon bener nanging ora ana ).
Kanggo nindakake iki, kita bisa nggawe validator sing validasi email siji-sijine, lan uga mriksa manawa email kasebut valid liwat panyedhiya eksternal.
Kita bisa nggunakake kickbox.com minangka layanan kita, lan kabeh iku nggoleki.
Apa yen kita uga pengin ngetrapake layanan liyane zerobounce.net, banjur kita bisa nerusake kanggo ngleksanakake.
Mengko, umpamane kita ngevaluasi kabutuhan liyane kanggo ndhukung uga usercheck.com , lan sapanunggalane.
Thanks kanggo pola Strategy, kita bisa nangani kabutuhan iki tanpa nggunakake statements kaya if-else
or switch
.
Yen tinimbang nggunakake pemrograman sing luwih terstruktur, mula kanthi nggunakake if-else lan switch, kita bakal entuk pas nyenyet saka kode, kang bakal nggawe angel banget kanggo kita nambah utawa ngganti algoritma ing tataran mengko. Kode dadi rumit, luwih angel dites, lan nglanggar prinsip desain utama.
Solusi
Il Pola strategi nawakake solusi elegan kanggo masalah iki dening misahake algoritma menyang kelas individu sing ngleksanakake antarmuka umum. Ide dhasar yaiku:
- Netepake antarmuka sing bakal dileksanakake dening kabeh algoritma.
- Ngleksanakake saben algoritma ing kelas konkrit sawijining.
- Kelas konteks nggunakake algoritma kasebut lan bisa kanthi dinamis ngalih ing antarane tanpa kudu ngganti logika internal.
Iki nerjemahake menyang kode resik lan maintainable , gampang ditambahi lan diowahi tanpa ngowahi logika sing ana. Cukup nambah strategi anyar yen perlu, tanpa ngganti kode klien.
Sadurunge kita nyilem menyang implementasine, ayo padha ngerti komponen kunci sing nggawe model observer.
- Konteks : obyek sing bakal utusan prilaku kanggo salah siji strategi sing ana.
- Antarmuka strategi : Antarmuka sing nemtokake prilaku kanggo kabeh Sastranegara. Sastranegara ngleksanakake antarmuka iki kanggo nyedhiyani implementasine unik saka prilaku.
- Sastranegara konkrit : Kelas sing ngleksanakake antarmuka strategi. Saben strategi encapsulates prilaku tartamtu sing konteks bisa pindhah menyang runtime.
Kode
- Antarmuka strategis . Kaping pisanan, kita nggawe antarmuka umum kanggo macem-macem strategi validasi.
<?php
antarmuka EmailValidationServiceInterface
{
fungsi publik isRealEmail(string $email): bool;
}
2. Saiki ayo nggawe sawetara strategi konkrit kanggo saben layanan kita arep kanggo ngleksanakake: Kickbox, Zerobounce lan Usercheck.
<?php
kelas KickboxService ngleksanakake EmailValidationServiceInterface
{
fungsi publik isRealEmail(string $email): bool
{
// Logika khusus KickboxService
bali bener;
}
}
kelas ZeroBounceService ngleksanakake EmailValidationServiceInterface
{
fungsi publik isRealEmail(string $email): bool
{
// logika ZeroBounceServicespecific
bali bener;
}
}
class UsercheckService ngleksanakake EmailValidationServiceInterface
{
fungsi publik isRealEmail(string $email): bool
{
// UsercheckService logika tartamtu
bali bener;
}
}
3. Saiki kita kudu ngleksanakake a kelas konteks . Iki tanggung jawab kanggo milih strategi layanan validasi sing cocog.
<?php
kelas EmailValidationContext
{
pribadi EmailValidationServiceInterface $emailValidation;
fungsi publik setEmailValidator(EmailValidationServiceInterface $emailValidation): EmailValidationServiceInterface
{
$this->emailValidation = $emailValidation;
}
validasi fungsi publik (string $email): bool
{
bali $this->emailValidation->isRealEmail($email);
}
}
Panganggone
Bagian pungkasan yaiku carane kita bisa nggunakake strategi ing aplikasi kita. Kita bisa ngetrapake strategi validasi email langsung ing pengontrol utawa ing validator Laravel khusus.
<?php
kelas RegisterController ngluwihi Controller
{
mriksa fungsi umum (Request $request)
{
$emailValidationContext = anyar EmailValidationContext();
// Kanggo alesan argumentasi, umpamane layanan kasebut asale saka panyuwunan
// utawa malah luwih apik diatur ing `/config/services.php`
// Pilih strategi adhedhasar layanan sing dipilih
switch ($request->service) {
kasus 'kickbox':
$emailValidationContext->setEmailValidator(new KickboxService());
mecah;
kasus 'zerobounce':
$emailValidationContext->setEmailValidator(new ZeroBounceService());
mecah;
kasus 'usercheck':
$emailValidationContext->setEmailValidator(new UsercheckService());
mecah;
gawan:
uncalan new \Exception("Layanan Validasi ora didhukung.");
}
// validasi email karo layanan
bali $emailValidationContext->validasi($request->email);
}
}
Wuku
1. Fleksibilitas lan extensibility
Pola Strategi nggawe gampang nambah strategi anyar tanpa ngganti kode sing wis ana. Contone, yen sampeyan kudu nambah layanan validasi anyar, sampeyan mung nggawe kelas anyar sing ngleksanakake EmailValidationServiceInterface
lan nyuntikake menyang konteks.
2. Ketaatan marang prinsip SOLID
- Prinsip mbukak / ditutup : Sistem iki mbukak kanggo ekstensi nanging ditutup kanggo modifikasi, saéngga fungsionalitas bisa ditambah tanpa ngowahi kode sing wis ana.
- Prinsip tanggung jawab tunggal : Saben kelas wis tanggung jawab, kang nggampangake kanggo njaga lan test.
3. Ngilangi logika kondisional
Model iki ngilangi kabutuhan instruksi rumit if-else
, switch
nggawe kode luwih resik lan luwih bisa diwaca.
Conto liyane
Sampeyan uga bisa nggunakake pola desain Strategi kanggo kasus panggunaan liyane, kayata ngolah pesenan kanthi gateway pembayaran sing beda ing platform e-commerce. Contone, sampeyan bisa duwe PayPal, Stripe, BankTransfer, etc., utawa nggunakake layanan pangiriman email beda, Mailgun, SendingBlue, SMTP, etc.