# Strategy Deseni

Adres: https://softwaredictionary.org/tr/terimler/strategy-pattern
Kategori: Yazılım Mimarisi
Son güncelleme: 2026-09-30
İngilizcesi: Strategy Pattern
Türkçe karşılığı: strateji deseni
Okunuşu: stretıci petırn

Kısaca: Strategy deseni, değiştirilebilir algoritmaları tek arayüzün arkasına koyup çalışma zamanında aralarında geçiş yapılmasını sağlayan davranışsal bir desendir.

## Strategy deseni nedir?

Strategy deseni, kargo hesaplamak, sonuçları sıralamak ya da dosyaları sıkıştırmak gibi aynı işi farklı yollarla yapan bir algoritma ailesini alır ve her birini ortak bir arayüzün arkasına koyar. Bunları kullanan kod, yani context, bir strateji referansı tutar ve hangisi olduğunu bilmeden onu çağırır. Davranışı değiştirmek artık context'i düzenlemek değil, farklı bir strateji geçirmek demektir.

Desen olmadan bu mantık çoğunlukla yeni bir seçenek çıktığında her seferinde düzenlenmesi gereken uzun bir `if/else` ya da `switch` bloğuna dönüşür. Stratejilerle her seçenek kendi sınıfında ya da fonksiyonunda yaşar, tek başına test edilebilir ve yenileri mevcut koda dokunmadan eklenebilir; bu, SOLID'deki açık-kapalı ilkesine uyar. Birinci sınıf fonksiyonları olan dillerde strateji çoğunlukla, bir sıralama metoduna verdiğiniz karşılaştırma fonksiyonu gibi, argüman olarak geçirilen bir fonksiyondan ibarettir.

Bir navigasyon uygulaması iyi bir benzetmedir: araba, bisiklet ya da yürüyüş seçersiniz ve uygulama her mod için farklı bir algoritma kullanarak aynı hedefe rota hesaplar. Gerçek dünya kullanımları arasında fiyatlandırma ve indirim kuralları, ödeme yöntemleri, kimlik doğrulama yöntemleri, yeniden deneme politikaları, doğrulama kuralları ve bir sıkıştırma ya da serileştirme biçimi seçmek bulunur.

Strateji deseni, ikisi de bir arayüzün arkasındaki nesneleri değiştirdiği için sıklıkla state deseniyle karıştırılır. Strateji deseninde algoritmayı istemci dışarıdan seçer; state deseninde ise nesne, bir siparişin beklemede durumundan gönderildi durumuna geçmesi gibi, iç durumu değiştikçe kendi davranışını değiştirir. Ayrıca factory deseniyle doğal olarak eşleşir: factory yapılandırmadan doğru stratejiyi seçebilir ve işi ardından strateji yapar.

## Önemli noktalar

- Strategy deseni, birbirinin yerine kullanılabilen algoritmaları ortak bir arayüzün arkasına koyar.
- Context, hangi somut stratejiye sahip olduğunu bilmeden onu kullanır.
- Uzun koşullu blokların yerini alır ve yeni seçenekleri eklemeyi kolaylaştırır.
- Birçok dilde bir strateji, argüman olarak geçirilen basit bir fonksiyon olabilir.
- Stratejilerde çağıran seçer; state deseninde nesne davranışını kendisi değiştirir.

## Örnek: Birbirinin yerine kullanılabilen fonksiyonlar olarak kargo stratejileri

```typescript
// Each strategy calculates shipping in a different way
type ShippingStrategy = (weightKg: number) => number;

const standard: ShippingStrategy = (kg) => 5 + kg * 0.5;
const express: ShippingStrategy = (kg) => 15 + kg * 1.2;
const storePickup: ShippingStrategy = () => 0;

// The context doesn't care which strategy it receives
function shippingCost(weightKg: number, strategy: ShippingStrategy) {
  return strategy(weightKg);
}

console.log(shippingCost(4, standard));    // 7
console.log(shippingCost(4, express));     // 19.8
console.log(shippingCost(4, storePickup)); // 0
```

## Sık sorulan sorular

**Strategy ile state desenleri arasındaki fark nedir?**

İkisi de davranışı birbirinin yerine geçebilen nesnelere devreder. Strategy deseninde algoritmayı çağıran seçer; state deseninde ise nesne olaylar gerçekleştikçe kendi başına durumlar arasında geçiş yapar ve her durum farklı bir davranış tanımlar.

**Bir callback fonksiyonu geçirmek strategy deseni midir?**

Esasen evet. Bir sıralama metoduna karşılaştırma fonksiyonu ya da ödeme koduna fiyatlandırma fonksiyonu geçirdiğinizde o fonksiyon bir stratejidir; birinci sınıf fonksiyonları olan diller yalnızca her biri için ayrı bir sınıfa ihtiyaç duymaz.

**Strategy deseni ne zaman kullanılmalı?**

Aynı görevi yapmanın birkaç yolu olduğunda ve aralarında çalışma zamanında seçim yapmanız gerektiğinde ya da bir koşullu blok yeni durumlarla büyümeye devam ettiğinde kullanın. Yalnızca iki kararlı seçenek varsa basit bir `if` ifadesi daha anlaşılır olabilir.

---

Software Dictionary: https://softwaredictionary.org/tr · https://softwaredictionary.org/tr/llms.txt
