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'));






