PHP Strategy Pattern ile Dinamik Algoritma Seçimi


 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 SiteleriFarklı indirim stratejileri (yüzde, sabit, kampanya)
💳 Ödeme SistemleriFarklı ödeme yolları: kredi kartı, havale, kapıda
🔎 Sıralama UygulamalarıFarklı sıralama algoritmaları (A-Z, tarih, fiyat)
📦 Kargo SeçimiKargo 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 da switch bloklarından kurtulursun

  • Yeni strateji eklemek için mevcut kodu değiştirmen gerekmez

  • Temiz, test edilebilir ve esnek bir yapı elde edersin








Related Posts

PHP Strategy Pattern ile Dinamik Algoritma Seçimi
4/ 5
Oleh