![]() |
Kod yazarken bazen belirli bir işlemin birden fazla farklı şekilde yapılması gerekebilir. Mesela indirim hesaplama, sıralama, ödeme yöntemi gibi durumlarda tek bir yapıya sıkışmak istemeyiz. İşte bu gibi durumlarda Strategy Pattern hayat kurtarır.
Bu yazıda Strategy Pattern nedir, ne için kullanılır, hangi projelerde kullanılır ve PHP ile nasıl uygulanır adım adım öğreniyoruz.
Strategy Pattern Nedir?
Strategy Pattern, bir işlemi gerçekleştirmek için kullanılan algoritmanın (stratejinin) dinamik olarak değiştirilmesini sağlayan bir tasarım desenidir.
Yani:
➡️ Her iş için farklı bir strateji (sınıf) oluşturursun,
➡️ Bu stratejiler birbirinin yerine geçebilir olur,
➡️ Kullanım anında hangisini çalıştırmak istiyorsan onu seçersin.
Basit Bir Benzetme
Bir kahveci düşün. Müşteri ister Türk kahvesi ister espresso ister latte isteyebilir. Hepsi "kahve yap" işlemi gibi görünse de içerik farklıdır. Kahveci bunu esnek bir şekilde yönetmelidir. Strategy deseni burada sana bu esnekliği sağlar.
Strategy Pattern Ne İçin Kullanılır?
-
Bir işlemin birden fazla versiyonu varsa (farklı algoritmalar)
-
Uygulama çalışırken davranışı değiştirmek isteniyorsa
-
Kod tekrarını ve if-else karmaşasını azaltmak gerekiyorsa
-
Açık/kapalı prensibini (OCP) uygulamak istiyorsan
Kullanıldığı Gerçek Proje Türleri
Proje Türü | Kullanım Örneği |
---|---|
🛒 E-Ticaret Siteleri | Farklı indirim stratejileri (yüzde, sabit, kampanya) |
💳 Ödeme Sistemleri | Farklı ödeme yolları: kredi kartı, havale, kapıda |
🔎 Sıralama Uygulamaları | Farklı sıralama algoritmaları (A-Z, tarih, fiyat) |
📦 Kargo Seçimi | Kargo türüne göre ücret hesaplama stratejileri |
PHP ile Strategy Pattern Uygulaması
Senaryo: Bir e-ticaret uygulamasında sepet toplamına farklı indirim stratejileri uygulanacak.
(Interface)
<?php
//DiscountStrategy.php (Interface)
interface DiscountStrategy {
public function apply($amount);
}
(Yüzde indirimi)
<?php
//PercentageDiscount.php (Yüzde indirimi)
require_once 'DiscountStrategy.php';
class PercentageDiscount implements DiscountStrategy {
private $percentage;
public function __construct($percentage) {
$this->percentage = $percentage;
}
public function apply($amount) {
return $amount - ($amount * $this->percentage / 100);
}
}
(Sabit indirim)
<?php
//FixedDiscount.php (Sabit indirim)
require_once 'DiscountStrategy.php';
class FixedDiscount implements DiscountStrategy {
private $discountAmount;
public function __construct($discountAmount) {
$this->discountAmount = $discountAmount;
}
public function apply($amount) {
return max(0, $amount - $this->discountAmount);
}
}
(İndirimi uygulayan sınıf)
<?php
//Cart.php (İndirimi uygulayan sınıf)
class Cart {
private $amount;
private $strategy;
public function __construct($amount) {
$this->amount = $amount;
}
public function setDiscountStrategy(DiscountStrategy $strategy) {
$this->strategy = $strategy;
}
public function getTotal() {
if ($this->strategy) {
return $this->strategy->apply($this->amount);
}
return $this->amount;
}
}
(Kullanım)
<?php
//index.php (Kullanım)
require_once 'PercentageDiscount.php';
require_once 'FixedDiscount.php';
require_once 'Cart.php';
$cart = new Cart(200);
// Yüzde %20 indirim uygula
$cart->setDiscountStrategy(new PercentageDiscount(20));
echo "Yüzdeli indirimli toplam: " . $cart->getTotal() . "₺\n";
// Sabit 30₺ indirim uygula
$cart->setDiscountStrategy(new FixedDiscount(30));
echo "Sabit indirimli toplam: " . $cart->getTotal() . "₺\n";
(Sonuc)
Yüzdeli indirimli toplam: 160₺
Sabit indirimli toplam: 170₺
Neden Strategy Kullanmalıyız?
-
if/else
ya daswitch
bloklarından kurtulursun -
Yeni strateji eklemek için mevcut kodu değiştirmen gerekmez
-
Temiz, test edilebilir ve esnek bir yapı elde edersin