Strategy Design Pattern – C#
Strategy Design Pattern, davranışsal (behavioral) tasarım desenlerinden biridir ve bir nesnenin algoritmasını çalışma zamanında (runtime) değiştirmeyi sağlar. Bu desen, algoritmaları birbirinden bağımsız olarak tanımlar ve birbirlerinin yerine kullanılabilecek şekilde tasarlar. Bu sayede kodun esnekliği ve yeniden kullanılabilirliği artar.
Bu tasarım desenini bir ödeme sisteminde kullandığımızı hayal edelim. Sistem içerisinde herhangi bir ödeme yöntemi seçtiğimizde, birden fazla ödeme seçeneği ile karşı karşıya kalıyoruz. Peki, bu durumda arka planda yani çalışma zamanı (runtime) sırasında seçilen ödeme yöntemine göre kodumuzu nasıl şekillendirebiliriz?
Strategy Design Pattern Avantajları
- Esneklik: Mevcut kodu değiştirmeden kolayca yeni ödeme yöntemleri eklenebilir.
- Ölçeklenebilirlik: Yeni stratejileri zahmetsizce destekleyen genişletilebilir bir yapıdır.
- Bakım Kolaylığı: Her ödeme yöntemi izole edilmiştir, bu da minimum bağımlılık sağlar.
UML Diagram

Code Structure
- IPaymentStrategy: Ödeme yapma işleminin interface’ini tanımlar.
- Concrete Strategies: Çeşitli ödeme yöntemlerinin uygulanması (CreditCardPayment, PayPalPayment, CryptoPayment).
- ShoppingCart: Farklı ödeme stratejileriyle etkileşime giren Context Class.
1-) Strategy Arayüz
public interface IPaymentStrategy
{
public void Pay(decimal amount);
}
2-) Concrete Strategy
public class CreditCardPayment : IPaymentStrategy
{
public void Pay(decimal amount)
{
Console.WriteLine($"Kredi Kartı ile {amount} TL ödendi.");
}
}
public class PayPalPayment : IPaymentStrategy
{
public void Pay(decimal amount)
{
Console.WriteLine($"PayPal üzerinden {amount} TL ödendi.");
}
}
public class CryptoPayment : IPaymentStrategy
{
public void Pay(decimal amount)
{
Console.WriteLine($"Kripto Para ile {amount} TL ödendi.");
}
}
3-) Context Class
public class ShoppingCart
{
private IPaymentStrategy _paymentStrategy;
public void SetPaymentStrategy(IPaymentStrategy paymentStrategy)
{
_paymentStrategy = paymentStrategy;
}
public void Checkout(decimal totalAmount)
{
if (_paymentStrategy is null)
{
Console.WriteLine("Lütfen bir ödeme yöntemi seçiniz!");
}
else
{
_paymentStrategy.Pay(totalAmount);
}
}
}
Uygulama ve Sonuç
var cart = new ShoppingCart();
decimal totalAmount = 1500m;
Console.WriteLine("Kredi Kartı Ödeme:");
cart.SetPaymentStrategy(new CreditCardPayment());
cart.Checkout(totalAmount);
Console.WriteLine("\nPayPal ile Ödeme:");
cart.SetPaymentStrategy(new PayPalPayment());
cart.Checkout(totalAmount);
Console.WriteLine("\nKripto Para ile Ödeme:");
cart.SetPaymentStrategy(new CryptoPayment());
cart.Checkout(totalAmount);
