CodeBlanks Logo Icon CodeBlanks

Strategy

C# kursu · İleri seviye · Ders 63/83

Strategy deseniyle algoritma ailesini öğrenirsin.

Strategy deseni

Strategy, bir işlemin farklı yöntemlerini (algoritmalarını) aynı arayüz altında toplar. İstemci, çalışma anında doğru stratejiyi seçer. Böylece if/else zinciri yerine polimorfik çağrı kullanılır.

Ödeme örneği: IPaymentStrategy arayüzü Pay(decimal) metodunu tanımlar. CreditCardPayment ve PayPalPayment somut stratejilerdir. PaymentContext bir strateji tutar ve Pay çağrısını seçili stratejiye iletir.

Uygulama PaymentContext ile ödeme stratejisi

interface IPaymentStrategy tanımla; string Pay(decimal amount) metodu olsun. CreditCardPayment ve PayPalPayment sınıfları sırasıyla "Kart: " + amount ve "PayPal: " + amount döndürsün. class PaymentContext bir IPaymentStrategy tutsun, SetStrategy(IPaymentStrategy) ile değiştirilebilsin ve Pay(decimal) çağrısını stratejiye iletsin. Main'de context'e CreditCardPayment ver ve Pay(100m) sonucunu yazdır.

Örnek çözümü göster
interface IPaymentStrategy { string Pay(decimal amount); } tanımla. CreditCardPayment ve PayPalPayment sınıfları uygulayın. PaymentContext içinde private IPaymentStrategy _strategy; public void SetStrategy(IPaymentStrategy s) => _strategy = s; public string Pay(decimal amount) => _strategy.Pay(amount); yaz. Main'de context.SetStrategy(new CreditCardPayment()); Console.WriteLine(context.Pay(100m));
Örnek çözüm:
using System;

interface IPaymentStrategy
{
    string Pay(decimal amount);
}

class CreditCardPayment : IPaymentStrategy
{
    public string Pay(decimal amount) => "Kart: " + amount;
}

class PayPalPayment : IPaymentStrategy
{
    public string Pay(decimal amount) => "PayPal: " + amount;
}

class PaymentContext
{
    private IPaymentStrategy _strategy;
    public void SetStrategy(IPaymentStrategy strategy) => _strategy = strategy;
    public string Pay(decimal amount) => _strategy.Pay(amount);
}

class Program
{
    static void Main()
    {
        var ctx = new PaymentContext();
        ctx.SetStrategy(new CreditCardPayment());
        Console.WriteLine(ctx.Pay(100m));
    }
}

Strategy ne zaman kullanılır?

Strategy özellikle şu durumlarda seçilir: aynı işin birden fazla yöntemi varsa, yöntemler çalışma anında değişebiliyorsa veya yeni bir yöntem eklemek sık yaşanıyorsa. Kredi kartı, havale, kripto gibi ödeme kanalları iyi bir örnektir.

Kaçınma: yalnızca tek bir yöntem varsa veya seçim hiç değişmiyorsa Strategy aşırı tasarım olur. Basit bir if yeterli olabilir. Desenler araçtır, amaç değil.

Kendini test et

  1. Strateji arayüzünü tanımla

    public ____ IPaymentStrategy { string Pay(decimal amount); }
    Cevabı göster
    public interface IPaymentStrategy { string Pay(decimal amount); }
  2. Strategy deseni if/else zincirine göre ne kazandırır?

    • Strateji, kalıtımı kaldırır
    • Strateji yalnızca sayılarla çalışır
    • Strateji her zaman daha hızlı çalışır
    • Yeni algoritma eklemeyi kolaylaştırır
    Cevabı göster

    Yeni algoritma eklemeyi kolaylaştırır — Doğru. Yeni strateji eklemek mevcut kodu değiştirmez; yalnızca yeni sınıf eklenir.

  3. Strategy parçalarını eşleştir

    Strategy
    Algoritma arayüzü
    ConcreteStrategy
    Somut algoritma
    Context
    Stratejiyi tutan sınıf
    SetStrategy
    Çalışma anında strateji değiştirir

İleri seviye bölümündeki tüm dersler