Strategy
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
-
Strateji arayüzünü tanımla
public ____ IPaymentStrategy { string Pay(decimal amount); }Cevabı göster
public interface IPaymentStrategy { string Pay(decimal amount); } -
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.
-
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