Menu
Coddy logo textTech

Strategy Kalıbı

Coddy'nin Java Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 69 / 87.

Strateji Kalıbı, bir algoritma ailesi tanımlamanıza, her birini kendi class’ı içinde kapsüllemenize ve bunları birbirinin yerine kullanılabilir hâle getirmenize olanak tanıyan davranışsal bir tasarım kalıbıdır. Belirli bir davranışı sabit kodlamak yerine, bunları kullanan kodu değiştirmeden çalışma zamanında algoritmaları değiştirebilirsiniz.

Birden fazla ödeme yöntemini destekleyen bir ödeme sistemi hayal edin. Strategy Pattern olmadan, karmaşık koşullu mantıkla karşı karşıya kalırdınız. Bununla birlikte, her ödeme yöntemi kendi stratejisi olur:

interface PaymentStrategy {
    void pay(int amount);
}

class CreditCardPayment implements PaymentStrategy {
    public void pay(int amount) {
        System.out.println("Paid " + amount + " via Credit Card");
    }
}

class PayPalPayment implements PaymentStrategy {
    public void pay(int amount) {
        System.out.println("Paid " + amount + " via PayPal");
    }
}

Bağlam sınıfı bir stratejiye başvuru tutar ve işi ona devreder. Buradaki önemli nokta, bağlamın hangi somut stratejiyi kullandığını bilmemesidir. Yalnızca arayüzü bilir:

class ShoppingCart {
    private PaymentStrategy paymentStrategy;
    
    public void setPaymentStrategy(PaymentStrategy strategy) {
        this.paymentStrategy = strategy;
    }
    
    public void checkout(int amount) {
        paymentStrategy.pay(amount);
    }
}

Artık ödeme davranışını dinamik olarak değiştirebilirsin:

ShoppingCart cart = new ShoppingCart();

cart.setPaymentStrategy(new CreditCardPayment());
cart.checkout(100);  // Kredi Kartı ile 100 ödendi

cart.setPaymentStrategy(new PayPalPayment());
cart.checkout(50);   // PayPal ile 50 ödendi

Strategy Pattern, bir eylemi gerçekleştirmenin birden fazla yoluna sahip olduğunuzda ve bunlar arasında kolayca geçiş yapmak istediğinizde öne çıkar. Yeni bir ödeme yöntemi eklemek, yalnızca PaymentStrategy uygulayan yeni bir sınıf oluşturmak anlamına gelir: mevcut kodda herhangi bir değişiklik yapmanız gerekmez.

challenge icon

Görev

Kolay

Strategy Pattern'ı kullanarak bir metin biçimlendirme sistemi oluşturalım! Çalışma zamanında farklı biçimlendirme stratejilerinin, metni çeşitli şekillerde dönüştürmek üzere değiştirilebildiği bir sistem oluşturacaksın; bu, birden fazla çıktı biçimini desteklemesi gereken bir uygulama için idealdir.

Kodunu dört dosyaya ayıracaksın:

  • TextFormatter.java: Tüm biçimlendirme stratejilerinin uygulayacağı TextFormatter arayüzünü tanımla. Bu arayüz, bir dize alan ve biçimlendirilmiş sürümünü döndüren tek bir String format(String text) yöntemi bildirmelidir.
  • Formatters.java: TextFormatter arayüzünü uygulayan üç somut strateji oluştur:

    UpperCaseFormatter - metni tamamen büyük harflere dönüştürür.

    LowerCaseFormatter - metni tamamen küçük harflere dönüştürür.

    TitleCaseFormatter - geri kalanını küçük harfe dönüştürürken her kelimenin ilk harfini büyük harfe çevirir. Kelimeler boşluklarla ayrılır.

  • TextEditor.java: Bir biçimlendirme stratejisi kullanan context sınıfını oluştur. TextEditor sınıfın şunlara sahip olmalıdır:

    Geçerli TextFormatter stratejisini tutan private bir alan.

    Etkin biçimlendirme stratejisini değiştiren bir setFormatter(TextFormatter formatter) yöntemi.

    Geçerli biçimlendiriciyi metne uygulayan ve publishText(String text) yazdıran bir Published: [formatted text] yöntemi. Hiçbir biçimlendirici ayarlanmadıysa Published: [original text] ifadesini değiştirmeden yazdırmalıdır.

  • Main.java: Strategy sistemini bir araya getir! İki girdi alacaksın: biçimlendirilecek metin (String) ve biçimlendirme stili (String: "upper", "lower" veya "title").

    Bir TextEditor oluştur ve herhangi bir biçimlendirici ayarlamadan önce giriş metninle publishText yöntemini çağır (varsayılan davranışı göstererek).

    Ardından stil girdisine göre uygun biçimlendirme stratejisini ayarla ve biçimlendirilmiş sonucu göstermek için aynı metinle publishText yöntemini tekrar çağır.

Sırayla iki girdi alacaksın: biçimlendirilecek metin (String) ve biçimlendirme stili (String).

Örneğin, girdiler hello world ve title olduğunda çıktın şöyle olur:

Published: hello world
Published: Hello World

TextEditor'ın belirli biçimlendirme mantığı hakkında hiçbir şey bilmediğine dikkat et. Yalnızca o anda ayarlanmış olan stratejiye yetki devreder. Bu, düzenleyici koduna dokunmadan yeni biçimlendirme stilleri eklemeyi son derece kolaylaştırır!

Kendin dene

import java.util.Scanner;

class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String text = scanner.nextLine();
        String style = scanner.nextLine();
        
        // TODO: Bir TextEditor örneği oluştur
        
        // TODO: Girdi metniyle publishText'i çağır (herhangi bir formatter ayarlamadan önce)
        
        // TODO: Stil girdisine göre ("upper", "lower" veya "title"),
        // uygun formatter'ı ayarla ve publishText'i tekrar çağır
        
    }
}
quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Nesne Yönelimli Programlama bölümündeki tüm dersler

Kendi başına pratik yap: Online Java derleyicisi