Menu
CoddyTech

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
80

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

challenge icon

Tantangan

Mudah

Mari 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 interface ShippingStrategy yang menetapkan kontrak untuk semua metode pengiriman. Interface ini harus memiliki method calculate(float $weight): float yang 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.00 berapa pun beratnya
    • ExpressShipping: Mengenakan biaya $2.00 per kilogram (kalikan berat dengan 2)
    • OvernightShipping: Mengenakan biaya dasar $10.00 ditambah $3.00 per kilogram
  • ShippingCalculator.php: Sertakan file ShippingStrategy dan buat class ShippingCalculator yang berperan sebagai konteks. Kalkulatormu harus:
    • Menerima ShippingStrategy di konstruktornya (gunakan promosi konstruktor)
    • Memiliki method setStrategy(ShippingStrategy $strategy): void untuk mengubah metode pengiriman saat program berjalan
    • Memiliki method calculateCost(float $weight): float yang meneruskan pemanggilan ke strategi saat ini
  • main.php: Sertakan file ShippingMethods dan ShippingCalculator. Kamu akan menerima dua input: jenis pengiriman ("standard", "express", atau "overnight") dan berat paket.

    Buat ShippingCalculator yang dimulai dengan StandardShipping. Berdasarkan input jenis pengiriman, gunakan setStrategy() 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]

?>
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Pemrograman Berorientasi Objek

Latihan sendiri: Compiler PHP online