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 ödendiStrategy 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.
Görev
KolayStrategy 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ğıTextFormatterarayüzünü tanımla. Bu arayüz, bir dize alan ve biçimlendirilmiş sürümünü döndüren tek birString format(String text)yöntemi bildirmelidir.Formatters.java:TextFormatterarayü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.TextEditorsınıfın şunlara sahip olmalıdır:Geçerli
TextFormatterstratejisini 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 birPublished: [formatted text]yöntemi. Hiçbir biçimlendirici ayarlanmadıysaPublished: [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
TextEditoroluştur ve herhangi bir biçimlendirici ayarlamadan önce giriş metninlepublishTextyö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
publishTextyö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 WorldTextEditor'ı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
}
}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
1OOP Temelleri
Harici DosyalarOOP'ye GirişSınıflar ve Nesnelerthis Anahtar KelimesiMetotlarAlanlar (Öznitelikler)Yapıcı MetotYapıcı Metot Aşırı YüklemeÖzet - Basit Hesap Makinesi4Kalıtım
Temel Kalıtım (extends)super Anahtar KelimesiMetot Geçersiz Kılma (@Override)Yapıcı Metot ZincirlemeObject SınıfıTekli ve Çok Seviyeli KalıtımNeden Çoklu Sınıf Kalıtımı Yok?Özet - Çalışan Hiyerarşisi7Özel Metotlar ve Object Sınıfı
toString() Metoduequals() ve hashCode()clone() MetoducompareTo() ve ComparableComparator ArayüzüÖzet - Özel Sıralama2Erişim Belirleyiciler ve Kapsülleme
Erişim Seviyelerine Genel BakışGetter ve Setter MetotlarıBilgi Gizlemefinal Anahtar KelimesiÖzet - Banka Hesabı Yöneticisi5Polimorfizm
Metot Aşırı Yükleme TemelleriMetot Geçersiz Kılma (Çalışma Zamanı)Upcasting ve Downcastinginstanceof OperatörüSoyut Sınıflar ve MetotlarÖzet - Şekil Hesaplayıcı8İleri Düzey OOP Kavramları
Kompozisyon vs KalıtımAgregasyon vs KompozisyonDahili, Yuvalanmış ve Anonim SınıflarEnum'lar ve Enum MetotlarıRecords (Java 16+)Sealed Classes (Java 17+)11Tasarım Kalıpları Bölüm 1
Tasarım Kalıplarına GirişSingleton KalıbıFactory KalıbıBuilder KalıbıObserver KalıbıStrategy Kalıbı14Final Meydan Okumaları
E-Öğrenme PlatformuBankacılık SistemiOyun Karakteri GeliştirmeAraç Kiralama Servisi3Sınıf Özellikleri ve Statik Üyeler
Instance ve Statik DeğişkenlerStatik MetotlarStatik BloklarSabitler (static final)Özet - Sayaç ve Utility6Arayüzler ve Soyut Sınıflar
Arayüzlere GirişArayüzleri UygulamaÇoklu Arayüz UygulamaArayüzlerde Default ve StaticSoyut Sınıflar ve ArayüzlerFonksiyonel ArayüzlerÖzet - Ödeme Sistemi9Generics
Generics'e GirişGeneric SınıflarGeneric MetotlarSınırlandırılmış Tip ParametreleriWildcard'lar (?, extends, super)Özet - Generic Container12Tasarım Kalıpları Bölüm 2
Komut KalıbıAdaptör KalıbıDekoratör KalıbıŞablon Metot KalıbıDurum KalıbıKompozit KalıbıYineleyici KalıbıKendi başına pratik yap: Online Java derleyicisi