CodeBlanks Logo Icon CodeBlanks

Strategy

Strategy desenini öğrenirsin.

Strategy deseni

Strategy, aynı işi yapan farklı algoritmaları değiştirilebilir kılar. Bir arayüz bir davranışı tanımlar; her somut sınıf bir algoritmadır. Bağlam (context) sınıfı, bir Strategy başvurusu tutar ve çalışma anında değiştirebilir.

Örnek: Payment arayüzü pay(int amount) tanımlar; CashPayment ve CardPayment iki algoritmadır. Cart sınıfı setPayment ile ödeme yöntemini değiştirir. Bu, büyük if-else zincirleri yerine temiz bir ayrım sağlar.

Lambda ile strategy

Bir Strategy arayüzü tek bir soyut yöntem içeriyorsa (işlevsel arayüz), lambda ile yazılabilir. Payment p = amount -> System.out.println(amount) biçiminde yeni bir sınıf tanımlamadan strategy oluşturulur.

Bu, özellikle küçük ve bir kez kullanılan algoritmalar için pratiktir. Yine de karmaşık algoritmalar adlı sınıflar olarak kalır; çünkü okunabilirlik ve test edilebilirlik önemlidir. Lambda, Strategy'nin gücünü daha da artırır.

Uygulama Ödeme strategy'sini uygula

Bir Payment arayüzü tanımla: void pay(int amount). CardPayment sınıfı bu arayüzü uygulasın ve pay içinde System.out.println ile kart ve amount değerini yazdırsın ("kart " + amount). Cart sınıfı setPayment(Payment) ve checkout(int amount) yöntemlerini içersin; checkout, p.pay(amount) çağrısı yapsın. main içinde CardPayment ile checkout(100) çağır.

Başlangıç kodu

Main.java
// Payment arayüzünü ve CardPayment sınıfını tanımla
// Cart sınıfına setPayment ekle
// main içinde checkout çağır

Örnek çözüm

Main.java
interface Payment { void pay(int amount); }

class CardPayment implements Payment {
    public void pay(int amount) { System.out.println("kart " + amount); }
}

class Cart {
    private Payment p;
    public void setPayment(Payment p) { this.p = p; }
    public void checkout(int amount) { p.pay(amount); }
}

public class StrategyDemo {
    public static void main(String[] args) {
        Cart c = new Cart();
        c.setPayment(new CardPayment());
        c.checkout(100);
    }
}

Beklenen çıktı

kart 100

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 Strategy çağrısını tamamla

Soru
cart.setPayment(new ____());
Cevap
cart.setPayment(new CardPayment());

Açıklama: CardPayment bir Strategy uygulamasıdır.

2 Strategy deseni ne zaman kullanılır?

  • Nesne sarma gerektiğinde
  • Tek örnek gerektiğinde
  • Aynı işin farklı algoritmalarla yapılacağı zaman Doğru cevap
  • Bildirim gönderileceğinde

Açıklama: Strategy, aynı işin farklı algoritmalarla yapılması için kullanılır.

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

Kavram Anlamı
Payment Ortak arayüz
CardPayment Bir algoritma
setPayment Strategy değiştirme
p.pay(amount) Algoritmayı çalıştırma

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