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.

Strategy Design Pattern

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ı

Strategy Design Pattern UML

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

Strategy Pattern Infographic


Kaynakça ve İleri Okuma


🧠 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

You may also like...

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir