Mengenal Strategy Pattern di PHP dalam arsitektur Modern

Seputar PHP623 Views

Strategy Pattern adalah salah satu pola desain yang paling sering digunakan oleh programmer PHP untuk membuat kode lebih fleksibel, mudah diubah, dan tetap rapi meskipun aplikasi tumbuh semakin besar. Dalam dunia pengembangan modern, terutama di proyek skala menengah ke atas, pola ini menjadi andalan untuk menghindari percabangan rumit serta memperjelas struktur logika yang dapat berubah sewaktu waktu.

Pada artikel ini, kita akan membahas Strategy Pattern secara detail mulai dari konsep, struktur, contoh implementasi, manfaat nyata di proyek PHP, hingga penggunaan dalam skenario nyata seperti pembayaran, diskon, perhitungan ongkir, dan lainnya. Semua dipaparkan dengan gaya berita programmer yang menjelaskan dengan lugas tanpa bahasa template.

“Strategy Pattern adalah penyelamat ketika aplikasi mulai penuh percabangan dan setiap fitur kecil butuh cara khusus agar tidak merusak struktur lama.”

“Di proyek komersial besar, pola ini hampir selalu muncul karena membantu tim memisahkan logika yang bisa dipertukarkan tanpa mengubah struktur utama.”


Mengapa Strategy Pattern Menjadi Sorotan dalam Ekosistem PHP

Dalam beberapa tahun terakhir, komunitas PHP melihat peningkatan signifikan dalam penggunaan pola desain untuk meningkatkan kualitas kode. Strategy Pattern masuk ke daftar teratas karena sifatnya yang sangat modular dan mudah digunakan bahkan oleh programmer pemula.

Ketika aplikasi mulai memiliki banyak fitur yang membutuhkan perilaku berbeda namun tetap berada dalam kategori tugas yang sama, struktur kode bisa menjadi berantakan. Strategy Pattern hadir untuk memecah masalah tersebut menjadi potongan logika yang berdiri sendiri agar tidak saling tumpang tindih.


Memahami Esensi Strategy Pattern

Strategy Pattern memungkinkan sebuah algoritma atau cara kerja diganti secara dinamis tanpa mengubah kode utama yang menggunakan algoritma tersebut. Artinya, alih alih membuat percabangan if atau switch yang panjang, developer cukup membuat beberapa kelas strategi yang bisa diganti kapan saja.

Pola ini memisahkan tindakan utama dari detail bagaimana tindakan itu dilakukan. Hal ini sejalan dengan prinsip Open Closed Principle yaitu kode sebaiknya terbuka untuk dikembangkan tetapi tertutup dari modifikasi langsung.


Struktur Dasar Strategy Pattern

Sebelum melihat contoh praktis, pahami dulu struktur pola desain ini. Secara umum ada tiga komponen penting.

  • Interface Strategy : Bagian ini menentukan apa saja metode yang harus dimiliki oleh setiap strategi.
  • Concrete Strategy : Setiap strategi spesifik akan menurunkan interface yang sudah ditentukan.
  • Context : Context adalah kelas yang menggunakan strategi. Ia menerima strategi melalui konstruktor atau setter sehingga perilaku bisa diganti dengan mudah.

Berikut struktur paling sederhana Strategy Pattern dalam PHP.

<?php

interface PaymentStrategy {
    public function pay($amount);
}

class GopayPayment implements PaymentStrategy {
    public function pay($amount) {
        echo "Pembayaran sebesar {$amount} menggunakan Gopay";
    }
}

class DanaPayment implements PaymentStrategy {
    public function pay($amount) {
        echo "Pembayaran sebesar {$amount} menggunakan Dana";
    }
}

class PaymentContext {
    private $strategy;

    public function __construct(PaymentStrategy $strategy) {
        $this->strategy = $strategy;
    }

    public function execute($amount) {
        $this->strategy->pay($amount);
    }
}

Penggunaan Strategy Pattern dalam Studi Kasus Pembayaran

Pada sistem e commerce biasanya ada beberapa metode pembayaran mulai dari transfer bank, e wallet, hingga virtual account. Jika semuanya digabungkan ke satu kelas, percabangannya akan menumpuk.

Dengan Strategy Pattern, setiap metode pembayaran hanya membutuhkan kelas strategi tersendiri.

Contoh pemanggilan:

<?php

$payment = new PaymentContext(new GopayPayment());
$payment->execute(150000);

$payment = new PaymentContext(new DanaPayment());
$payment->execute(200000);

Kode menjadi modular dan mudah ditambah strategi baru tanpa mengubah context. Cukup tambahkan kelas baru seperti OvoPayment atau ShopeepayPayment.


Mengapa Strategy Pattern Sering Menggantikan If Else dan Switch

Dalam bahasa PHP yang sangat fleksibel, if else sering dipakai bahkan untuk logika yang seharusnya berada di dalam kelas terpisah. Hasilnya adalah kode yang sulit dipelihara.

Penggunaan Strategy Pattern menghilangkan percabangan tersebut. Logika perilaku tidak lagi dikontrol oleh kondisi tetapi oleh objek strategi yang diberikan ke context.

Programmer senior sering mengatakan bahwa Strategy Pattern adalah cara elegan untuk mengurangi baris kode dan meningkatkan kualitas di waktu yang bersamaan.


Skenario Nyata Penggunaan Strategy Pattern dalam Proyek PHP

Ada banyak kasus di lapangan di mana pola ini bekerja sangat bagus. Setiap bagian ini dijelaskan dengan contoh agar mudah dipahami.

Sistem Perhitungan Ongkir

Setiap jasa kurir memiliki cara hitung biaya yang berbeda. Dengan pola ini, Anda bisa membuat strategi seperti:

  • JneShipping
  • JntShipping
  • SicepatShipping

Context cukup diberi strategi yang berbeda lewat setter.

Sistem Promo dan Diskon

Diskon bisa berdasarkan reguler, member, seasonal atau voucher khusus. Kelas strategi akan memisahkan semuanya.

Sistem Notifikasi

Mulai dari email, SMS, WhatsApp hingga Push Notification dapat dipisahkan dalam bentuk strategi terpisah.


Contoh Strategy Pattern untuk Menghitung Diskon

Kasus diskon adalah salah satu implementasi paling populer dalam dunia PHP terutama di toko online.

<?php

interface DiscountStrategy {
    public function calculate($price);
}

class MemberDiscount implements DiscountStrategy {
    public function calculate($price) {
        return $price * 0.9;
    }
}

class SeasonalDiscount implements DiscountStrategy {
    public function calculate($price) {
        return $price * 0.8;
    }
}

class NoDiscount implements DiscountStrategy {
    public function calculate($price) {
        return $price;
    }
}

class DiscountContext {
    private $strategy;

    public function setStrategy(DiscountStrategy $strategy) {
        $this->strategy = $strategy;
    }

    public function getPriceAfterDiscount($price) {
        return $this->strategy->calculate($price);
    }
}

Cara penggunaan:

<?php

$discount = new DiscountContext();
$discount->setStrategy(new SeasonalDiscount());
echo $discount->getPriceAfterDiscount(100000);

Keunggulan Strategy Pattern dalam Jangka Panjang

Pola desain ini digunakan oleh banyak framework besar seperti Symfony, Laravel, Magento dan lainnya. Penyebabnya sederhana yaitu pola ini membuat kode lebih bersih dan mudah diperluas.

Berikut keunggulan yang paling terlihat.

  • Perilaku Mudah Ditambah : Cukup buat kelas strategi baru tanpa menyentuh context. Codebase tetap stabil meskipun ada logika tambahan.
  • Testing Menjadi Lebih Mudah : Unit testing dapat dilakukan pada kelas strategi secara terpisah tanpa harus memanggil seluruh context.
  • Mematuhi Prinsip SOLID : Strategy Pattern sangat cocok dengan prinsip Open Closed Principle dan Dependency Inversion Principle.

Implementasi Strategy Pattern untuk Sistem Notifikasi

Sistem notifikasi termasuk bagian paling dinamis dalam aplikasi modern. Ketika satu platform mengalami perubahan API, perubahan tidak merusak keseluruhan struktur.

Contoh struktur strategi notifikasi:

<?php

interface NotificationStrategy {
    public function send($message);
}

class EmailNotification implements NotificationStrategy {
    public function send($message) {
        echo "Mengirim email: {$message}";
    }
}

class SmsNotification implements NotificationStrategy {
    public function send($message) {
        echo "Mengirim SMS: {$message}";
    }
}

class NotificationContext {
    private $strategy;

    public function __construct(NotificationStrategy $strategy) {
        $this->strategy = $strategy;
    }

    public function notify($message) {
        $this->strategy->send($message);
    }
}

Perbandingan Strategy Pattern dengan Template Method

Di kalangan programmer sering muncul perdebatan apakah suatu fitur lebih cocok menggunakan Strategy Pattern atau Template Method. Perbedaannya terletak pada fleksibilitas.

Strategy Pattern memberikan kemampuan mengganti algoritma secara dinamis. Sementara Template Method menentukan kerangka tetap dan algoritma di dalamnya hanya bisa diubah lewat pewarisan.

Dalam PHP yang sangat fleksibel, Strategy Pattern lebih sering dipilih untuk logika yang bisa berubah ubah mengikuti kebutuhan user.


Cara Menggunakan Strategy Pattern untuk Mempercepat Pengembangan Tim

Dalam tim pengembang, pola desain ini bukan hanya tentang kualitas kode tetapi juga memudahkan kolaborasi.

Programmer junior dapat fokus membuat strategi baru tanpa takut merusak class utama. Sedangkan programmer senior memastikan context tetap bersih.

Pendekatan ini membuat setiap bagian kode memiliki tanggung jawab jelas yang sangat dihargai dalam arsitektur modern.


Strategy Pattern dalam Arsitektur Laravel

Laravel sendiri menggunakan banyak pola desain termasuk Strategy Pattern. Salah satu implementasi yang paling terlihat adalah cara Laravel menangani hashing, notifikasi dan queue driver.

Setiap driver adalah strategi. Anda bisa mengganti strategi hashing dari bcrypt ke argon tanpa mengubah kode utama. Inilah bukti bahwa Strategy Pattern adalah bagian penting dalam framework besar.


Contoh Advanced Strategy Pattern Menggunakan Dependency Injection Container

Dalam aplikasi besar seperti Laravel, strategi tidak dipanggil secara manual melainkan melalui container.

Contoh sederhana implementasi menggunakan container:

<?php

class AppContainer {
    protected $bindings = [];

    public function bind($name, $resolver) {
        $bindings[$name] = $resolver;
    }

    public function make($name) {
        return $bindings[$name]();
    }
}

Strategi kemudian bisa diubah dari konfigurasi sehingga sistem menjadi sangat fleksibel.


Membuat Strategy Pattern yang Support Konfigurasi

Beberapa aplikasi menyediakan file konfigurasi seperti config/payment.php yang berisi strategi aktif untuk proses tertentu. Pendekatan ini membuat program dapat diganti perilakunya tanpa menulis ulang kode.

Contoh pseudo konfigurasi:

return [
    'active' => 'gopay',
    'drivers' => [
        'gopay' => GopayPayment::class,
        'dana' => DanaPayment::class,
    ]
];

Context hanya memanggil strategi berdasarkan konfigurasi ini.


Kombinasi Strategy Pattern dengan Factory Pattern

Strategy Pattern semakin kuat bila digabungkan dengan Factory Pattern. Factory bertugas membuat strategi berdasarkan kebutuhan aplikasi.

Contoh sederhana:

<?php

class PaymentFactory {
    public static function create($method) {
        return match($method) {
            'gopay' => new GopayPayment(),
            'dana' => new DanaPayment(),
            default => throw new Exception("Metode tidak dikenal")
        };
    }
}

Context tinggal menerima strategi dari factory:

$payment = new PaymentContext(PaymentFactory::create('gopay'));

Leave a Reply

Your email address will not be published. Required fields are marked *