Programlamada Tasarım Desenleri #13 — Strategy Design Pattern (dotnet c#)
Programlamada Tasarım Desenleri #13 – Strategy Design Pattern (C# ile .NET)
Tasarım desenleri serimizin 13. yazısında, yazılım geliştiricilerin davranışsal tasarım desenlerinden biri olan Strategy Design Pattern üzerine odaklanıyoruz. C# ile nasıl uygulanır, ne zaman ihtiyaç duyulur ve gerçek dünya senaryolarında neden önemlidir, adım adım ele alacağız.

Anahtar Kelimeler: Strategy Design Pattern nedir, Strategy Pattern C#, Tasarım Desenleri, C# Design Patterns, .NET Design Patterns, Davranışsal Tasarım Desenleri
Strategy Design Pattern Nedir?
Strategy Design Pattern, bir algoritmayı, onun kullandığı sınıftan ayırarak kapsüller. Amaç, birbirinin yerine geçebilecek farklı algoritmaları (veya davranışları) dış dünyada değiştirmeden çalışma zamanında dinamik olarak değiştirebilmektir.
Bu desen özellikle şu durumlarda çok faydalıdır:
- Farklı algoritmalar arasında seçim yapmanız gerekiyorsa,
- Davranışı çalışma zamanında değiştirebilmek istiyorsanız,
- Kod tekrarından kaçınmak ve sürdürülebilir bir yapı elde etmek istiyorsanız.
Strategy Pattern’in Faydaları Nelerdir?
- ✔️ Kod tekrarını azaltır
- ✔️ Açık-kapalı prensibini (Open/Closed Principle) destekler
- ✔️ Yeni stratejiler/algoritmalar eklemeyi kolaylaştırır
- ✔️ Kodun test edilebilirliğini artırır
- ✔️ Dinamik davranış değişikliği sağlar
Strategy Design Pattern UML Diyagramı

UML diyagramında üç ana bileşen bulunur:
- Context: Stratejiyi barındıran asıl sınıf
- IStrategy: Ortak arayüz
- ConcreteStrategyA / B: Farklı algoritmaları gerçekleştiren sınıflar
C# ile Strategy Design Pattern Uygulaması
.NET dünyasında Strategy Pattern oldukça esneklik sağlar. Örneğin; bir ödeme sisteminde farklı ödeme yöntemlerini (Kredi Kartı, Havale, Kripto vb.) strateji olarak uygulayabilirsiniz.
Senaryo: Farklı İndirim Stratejileri Kullanan Bir E-Ticaret Uygulaması
Örnek: Müşteriye uygulanan indirim stratejisi farklılık gösterebilir.
1. Strategy Arayüzünü Tanımlayalım
public interface IDiscountStrategy { decimal ApplyDiscount(decimal totalAmount);}
2. Örnek Strateji Sınıflarını Oluşturalım
public class SeasonalDiscount : IDiscountStrategy { public decimal ApplyDiscount(decimal totalAmount) { return totalAmount * 0.90m; // %10 indirim }}
public class NoDiscount : IDiscountStrategy { public decimal ApplyDiscount(decimal totalAmount) { return totalAmount; }}
public class BlackFridayDiscount : IDiscountStrategy { public decimal ApplyDiscount(decimal totalAmount) { return totalAmount * 0.70m; // %30 indirim }}
3. Context Sınıfı: ‘ShoppingCart’
public class ShoppingCart { private readonly IDiscountStrategy _discountStrategy; public ShoppingCart(IDiscountStrategy discountStrategy) { _discountStrategy = discountStrategy; } public decimal CalculateTotal(decimal originalTotal) { return _discountStrategy.ApplyDiscount(originalTotal); }}
4. Kullanımı
class Program { static void Main(string[] args) { decimal totalAmount = 1000; // Black Friday indirimi uygula var cart1 = new ShoppingCart(new BlackFridayDiscount()); Console.WriteLine($"Black Friday Tutar: {cart1.CalculateTotal(totalAmount)}"); // Mevsimsel indirim uygula var cart2 = new ShoppingCart(new SeasonalDiscount()); Console.WriteLine($"Mevsimsel Tutar: {cart2.CalculateTotal(totalAmount)}"); // İndirim uygulanmıyor var cart3 = new ShoppingCart(new NoDiscount()); Console.WriteLine($"Standart Tutar: {cart3.CalculateTotal(totalAmount)}"); }}
Strategy Pattern Kullanım Senaryoları
- Farklı ödeme yöntemleri (Stripe, PayPal, Havale)
- Farklı veri sıralama algoritmaları
- Metin biçimlendirme (HTML, Markdown, JSON)
- Makine öğrenmesi modelleri arasında seçim
- Oyun oynanış modları (Agresif, Defansif)
Strategy Design Pattern vs. Diğer Yaklaşımlar
- Switch-case Kullanımı: Strategy desenlerini tercih ederek “if-else” veya “switch” ifadelerinden sıyrılabilirsiniz.
- Polymorphism: Strategiler arayüz üzerinden çağrıldığında, polimorfizmden faydalanılır.
- Decorator Pattern ile birlikte bile kullanılabilir (örneğin, önce indirim sonra kargo ekleme gibi).
Strategy Design Pattern için En İyi Pratikler
- ✅ Arayüzü sade ve anlaşılır tutun
- ✅ Context sınıfını fazla bağımlılıktan kaçının
- ✅ Yeni strategileri ayrı dosyalarda tanımlayın
- ✅ DI (Dependency Injection) ile stratejileri kolay yönetin
- ✅ Lazy loading kullanarak belleği etkili kullanın
Strategy Pattern ve .NET Dependency Injection
Strategy’leri bir DI container ile yönetmek oldukça etkilidir:
services.AddScoped
veya tüm stratejileri kaydedip, iş kurallarına göre seçim yapabilirsiniz.
Sonuç: Strategy Pattern ile Esnek ve Ölçeklenebilir Kod
Strategy tasarım deseni, yazılım geliştirme sürecine esneklik, yeniden kullanılabilirlik ve test edilebilirlik katar. Özellikle farklı davranışların, çalışma zamanında seçilebilmesi gereken durumlarda oldukça hayat kurtarıcıdır.
.NET ve C# ile bu yapıyı oluşturmak oldukça kolaydır. Karmaşık iş mantıklarını sadeleştirmek ve sürdürülebilir hale getirmek için Strategy Pattern vazgeçilmez bir çözümdür.
Sıkça Sorulan Sorular (SSS)
✔️ Strategy Pattern ne zaman kullanılmalı?
Farklı iş kurallarını runtime’da kolayca değiştirmek istiyorsanız kullanmalısınız.
✔️ Strategy Pattern hangi tasarım prensiplerini destekler?
SOLID prensiplerinden özellikle Open/Closed ve Single Responsibility ilkelerini destekler.
✔️ C# içinde Strategy Pattern nasıl test edilir?
Her bir ConcreteStrategy için bağımsız birim testi yazılabilir. Context sınıfı da Mock objeler ile test edilebilir.
Görselli Özet

Kaynakça ve İleri Okuma
- Refactoring.Guru — Strategy Pattern
- Microsoft Docs: Behavioral Patterns
- Gang of Four Design Patterns
🧠 Siz ne düşünüyorsunuz? Strategy Pattern’i projelerinizde nasıl kullanıyorsunuz? Yorumlara yazmayı unutmayın.
📩 Yazının PDF versiyonunu indirmek için buraya tıklayın.
📬 Yeni yazılardan haberdar olmak için bültene abone olmayı unutmayın!
Etiketler: #StrategyPattern #DesignPatterns #Csharp #Dotnet #TasarımDeseni #CsharpProgramlama #YazılımMühendisliği