Pola Strategy
Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan PHP di Coddy. Pelajaran 74 dari 91.
Strategy Pattern adalah pola desain perilaku yang memungkinkan kamu menentukan sekumpulan algoritma, mengenkapsulasi setiap algoritma dalam class tersendiri, dan membuatnya dapat saling dipertukarkan saat program berjalan. Object yang menggunakan strategi tidak perlu mengetahui algoritma mana yang sedang dijalankannya.
Bayangkan keranjang belanja yang dapat menerapkan berbagai strategi diskon. Daripada menulis logika diskon secara langsung dengan percabangan, kamu mendefinisikan setiap diskon sebagai class terpisah:
<?php
interface DiscountStrategy {
public function calculate(float $total): float;
}
class NoDiscount implements DiscountStrategy {
public function calculate(float $total): float {
return $total;
}
}
class PercentageDiscount implements DiscountStrategy {
public function __construct(private int $percent) {}
public function calculate(float $total): float {
return $total - ($total * $this->percent / 100);
}
}
class FixedDiscount implements DiscountStrategy {
public function __construct(private float $amount) {}
public function calculate(float $total): float {
return max(0, $total - $this->amount);
}
}
class konteks menerima strategi apa pun dan mendelegasikan perhitungannya:
<?php
class ShoppingCart {
public function __construct(private DiscountStrategy $discount) {}
public function setDiscount(DiscountStrategy $discount): void {
$this->discount = $discount;
}
public function checkout(float $total): float {
return $this->discount->calculate($total);
}
}
$cart = new ShoppingCart(new NoDiscount());
echo $cart->checkout(100) . "\n";
$cart->setDiscount(new PercentageDiscount(20));
echo $cart->checkout(100);
Output:
100
80Strategy Pattern sangat berguna saat kamu memiliki beberapa cara untuk melakukan operasi dan ingin beralih di antaranya tanpa mengubah class yang menggunakannya. Untuk menambahkan tipe diskon baru, kamu hanya perlu membuat class baru, bukan mengubah kode yang sudah ada.
Tantangan
MudahMari kita buat kalkulator biaya pengiriman menggunakan Pola Strategi. Setiap metode pengiriman memiliki aturan harga yang berbeda: pengiriman standar mengenakan tarif tetap, pengiriman ekspres menambahkan persentase, dan pengiriman semalam menggabungkan keduanya. Pola Strategi memungkinkan kamu mengganti perhitungan ini tanpa mengubah kode yang menggunakannya.
Kamu akan mengatur kodemu dalam empat file:
ShippingStrategy.php: Buat interfaceShippingStrategyyang menetapkan kontrak untuk semua metode pengiriman. Interface ini harus memiliki methodcalculate(float $weight): floatyang menerima berat paket dan mengembalikan biaya pengiriman.ShippingMethods.php: Sertakan file ShippingStrategy dan buat tiga class yang mengimplementasikan interface tersebut:StandardShipping: Mengenakan tarif tetap$5.00berapa pun beratnyaExpressShipping: Mengenakan biaya$2.00per kilogram (kalikan berat dengan 2)OvernightShipping: Mengenakan biaya dasar$10.00ditambah$3.00per kilogram
ShippingCalculator.php: Sertakan file ShippingStrategy dan buat classShippingCalculatoryang berperan sebagai konteks. Kalkulatormu harus:- Menerima
ShippingStrategydi konstruktornya (gunakan promosi konstruktor) - Memiliki method
setStrategy(ShippingStrategy $strategy): voiduntuk mengubah metode pengiriman saat program berjalan - Memiliki method
calculateCost(float $weight): floatyang meneruskan pemanggilan ke strategi saat ini
- Menerima
main.php: Sertakan file ShippingMethods dan ShippingCalculator. Kamu akan menerima dua input: jenis pengiriman ("standard","express", atau"overnight") dan berat paket.Buat
ShippingCalculatoryang dimulai denganStandardShipping. Berdasarkan input jenis pengiriman, gunakansetStrategy()untuk beralih ke metode pengiriman yang sesuai. Lalu, hitung biaya untuk berat yang diberikan dan cetak hasilnya dengan format dua angka desimal.Outputnya harus berupa:
Shipping cost: $[cost]
Tantangan ini menunjukkan bagaimana Pola Strategi membuat sistem pengirimanmu fleksibel: menambahkan metode pengiriman baru seperti SameDayShipping hanya memerlukan pembuatan class baru yang mengimplementasikan interface, tanpa mengubah kalkulator atau metode pengiriman yang sudah ada.
Coba sendiri
<?php
require_once 'ShippingMethods.php';
require_once 'ShippingCalculator.php';
// Baca input
$shippingType = trim(fgets(STDIN));
$weight = floatval(fgets(STDIN));
// TODO: Buat ShippingCalculator dengan StandardShipping sebagai pilihan awal
// TODO: Berdasarkan input jenis pengiriman ("standard", "express", atau "overnight"),
// gunakan setStrategy() untuk beralih ke method pengiriman yang sesuai
// TODO: Hitung biaya untuk berat yang diberikan
// TODO: Tampilkan hasil dengan dua angka di belakang koma
// Format output: Shipping cost: $[cost]
?>Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Pemrograman Berorientasi Objek
1Dasar-Dasar OOP
File EksternalPengenalan OOPclass vs objectKata Kunci $thismethodpropertyConstructor (__construct)Destructor (__destruct)Ringkasan: Kalkulator Sederhana4Pewarisan
Pewarisan DasarKata Kunci parent::Penimpaan methodKata Kunci finalClass AbstrakRingkasan: Hierarki Karyawan7Enkapsulasi
Public, Protected, PrivateModifier Akses secara MendalamGetter dan SetterPenyembunyian InformasiPromosi Constructor (8.0)Ulasan: Sistem Catatan Siswa2Namespace dan Autoloading
Pengenalan NamespaceKata Kunci useStandar Autoloading PSR-4Autoloader ComposerRingkasan: Proyek yang Terorganisasi5Interface dan Kontrak
Pengenalan InterfaceMengimplementasikan InterfaceImplementasi Beberapa InterfaceInterface vs Abstract ClassPetunjuk Tipe dengan InterfaceRekap: Kalkulator Bentuk8Magic Methods
Pengantar Magic Methods__toString & __debugInfo__get, __set, __isset, __unset__call & __callStatic__clone & Cloning Object__serialize & __unserializeRingkasan: Koleksi Kustom11Sistem Tipe Data dan Penanganan Error
Deklarasi TipeTipe NullableTipe Union dan IntersectionClass ExceptionHierarki Exception KustomTry, Catch, FinallyRekap: Validator Form3Property dalam class
Property instance vs staticKonstanta dalam classMethod & property staticProperty private & protectedProperty readonly (PHP 8.1)Ulasan: Pengelola Rekening Bank6Polimorfisme
Meninjau Kembali Method OverridingPolimorfisme melalui AntarmukaPetunjuk Tipe dan Tipe UnionPengikatan Statis TertundaRangkuman: Pemroses PembayaranLatihan sendiri: Compiler PHP online