Giriş
Farklı algoritmalar veya iş kuralları, uygulama gereksinimlerine göre runtime anında seçilebiliyorsa, Strategy Pattern devreye girer. Örneğin; bir ödeme sisteminde kredi kartı, banka havalesi veya mobil ödeme stratejileri tek bir arayüzden yönetilir.
Bu yazıda:
- Strategy Pattern nedir?
- Kurulum ve temel örnek
- Katmanlı mimaride kullanımı
- Karmaşık senaryolar & parametrik seçim
- Avantaj & Dezavantajlar

1. Strategy Pattern Nedir?
- Amacı: Bir davranış ailesi tanımlayıp, bunları birbirinin yerine kullanılır hale getirmek.
- Temel Bileşenler:
-
Context: Stratejiyi kullanan sınıf.
-
Strategy (Arayüz): Davranış tipini tanımlar.
-
ConcreteStrategy: Strategy arayüzünü uygulayan sınıflar.
-
2. Kurulum ve Basit Örnek
A. Strategy Arayüzü
public interface IPaymentStrategy
{
void Pay(decimal amount);
}
B. ConcreteStrategy’ler
public class CreditCardPayment : IPaymentStrategy
{
public void Pay(decimal amount)
{
Console.WriteLine($"Kredi kartından {amount} TL ödendi.");
}
}
public class BankTransferPayment : IPaymentStrategy
{
public void Pay(decimal amount)
{
Console.WriteLine($"Havale ile {amount} TL ödendi.");
}
}
C. Context
public class PaymentProcessor
{
private readonly IPaymentStrategy _strategy;
public PaymentProcessor(IPaymentStrategy strategy)
{
_strategy = strategy;
}
public void ProcessPayment(decimal amount)
{
_strategy.Pay(amount);
}
}
D. Kullanım
var creditProcessor = new PaymentProcessor(new CreditCardPayment());
creditProcessor.ProcessPayment(100m);
var transferProcessor = new PaymentProcessor(new BankTransferPayment());
transferProcessor.ProcessPayment(200m);
3. Katmanlı Mimari Entegrasyonu
| Katman | Rol |
|---|---|
| Domain | IPaymentStrategy, CreditCardPayment vb. |
| Application | PaymentProcessor (Context) |
| API / UI | Controller / UI butonuyla strateji seçimi |

4. Karmaşık Senaryolar & Parametrik Seçim
A. Parametreye Göre Seçim
public static class PaymentStrategyFactory
{
public static IPaymentStrategy Create(string type) => type switch
{
"CreditCard" => new CreditCardPayment(),
"BankTransfer"=> new BankTransferPayment(),
_ => throw new ArgumentException("Bilinmeyen ödeme tipi.")
};
}
// Kullanım
var strategy = PaymentStrategyFactory.Create(userChoice);
new PaymentProcessor(strategy).ProcessPayment(150m);
B. Dinamik Yükleme (Reflection)
var type = Type.GetType($"MyApp.Strategies.{strategyName}");
var strategy = (IPaymentStrategy)Activator.CreateInstance(type);
new PaymentProcessor(strategy).ProcessPayment(amount);
5. Avantajlar & Dezavantajlar
Avantajlar
- Esneklik: Yeni strateji eklemek, Context’i değiştirmeyi gerektirmez.
- Tek Sorumluluk: Her strateji kendi sınıfında kapsüllenmiş.
- Test Edilebilirlik: Her strateji kolayca mock edilebilir.
Dezavantajlar
- Klasik Yük: Çok sayıda ConcreteStrategy sınıfı yönetimi zorlaşabilir.
- Ekstra Kod: Basit durumlarda gereksiz kompleksite.
İleri Okuma ve Kaynaklar
Sonuç
Strategy Pattern ile dinamik davranış seçimini soyutlayarak, uygulamanızın esnekliğini ve bakım kolaylığını artırabilirsiniz. Katmanlı yapılarda Context ve Strategy’leri doğru katmana yerleştirerek clean code prensiplerine uygun ilerleyin.