Menu
Coddy logo textTech

Strategy Deseni

Coddy'nin Dart Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 93 / 110.

Strateji deseni, bir algoritma ailesi tanımlamanıza, her birini kendi sınıfında kapsüllemenize ve bunları çalışma zamanında birbirinin yerine kullanılabilir hale getirmenize olanak tanır. Davranışı bir sınıfa doğrudan kodlamak yerine, davranışı bir arayüz aracılığıyla enjekte edersiniz; bu da onları kullanan sınıfı değiştirmeden stratejileri değiştirmenize olanak tanır.

Farklı ödeme yöntemlerini desteklemek istediğiniz bir ödeme sistemini düşünün. Her bir yöntemi işlemek için koşullu ifadeler kullanmak yerine, bir strateji arayüzü tanımlarsınız ve somut uygulamalar oluşturursunuz:

abstract class PaymentStrategy {
  void pay(double amount);
}

class CreditCardPayment implements PaymentStrategy {
  @override
  void pay(double amount) => print('Paid \$$amount with Credit Card');
}

class PayPalPayment implements PaymentStrategy {
  @override
  void pay(double amount) => print('Paid \$$amount with PayPal');
}

class ShoppingCart {
  PaymentStrategy _paymentStrategy;

  ShoppingCart(this._paymentStrategy);

  void setPaymentStrategy(PaymentStrategy strategy) {
    _paymentStrategy = strategy;
  }

  void checkout(double total) {
    _paymentStrategy.pay(total);
  }
}

void main() {
  var cart = ShoppingCart(CreditCardPayment());
  cart.checkout(99.99);  // Kredi Kartı ile $99.99 ödendi

  cart.setPaymentStrategy(PayPalPayment());
  cart.checkout(49.99);  // PayPal ile $49.99 ödendi
}

ShoppingCart, ödemenin nasıl çalıştığını bilmez veya umursamaz; sadece o an ayarlanmış olan stratejiye devreder. Sepet koduna dokunmadan yeni strateji sınıfları oluşturarak yeni ödeme yöntemleri ekleyebilirsiniz. Bu desen, bir eylemi gerçekleştirmenin birden fazla yolu olduğunda ve bunlar arasında dinamik olarak seçim yapmak veya geçiş yapmak istediğinizde idealdir.

challenge icon

Görev

Kolay

Strategy desenini kullanarak bir metin biçimlendirme sistemi oluşturalım! Metne farklı biçimlendirme stratejilerinin uygulanabildiği ve kullanıcıların temel metin işlemcisini değiştirmeden biçimler arasında dinamik olarak geçiş yapabildiği bir sistem oluşturacaksınız.

Kodunuzu iki dosyada düzenleyeceksiniz:

  • formatting_strategies.dart: Strateji sisteminizi burada oluşturun. FormattingStrategy adlı, String format(String text) metoduna sahip soyut bir sınıf tanımlayın. Ardından üç somut strateji uygulayın:
    • UppercaseStrategy - metni tamamen büyük harfe dönüştürür
    • LowercaseStrategy - metni tamamen küçük harfe dönüştürür
    • TitleCaseStrategy - her kelimenin ilk harfini büyük yapar (boşluklara göre ayırır, her kelimenin ilk karakterini büyük yapar, geri kalanını küçük harfe dönüştürür)
    Ayrıca bir TextProcessor tutan FormattingStrategy sınıfı oluşturun. Bu sınıfın başlangıç stratejisini kabul eden bir oluşturucusu, çalışma zamanında stratejiyi değiştirmek için bir setStrategy() metodu ve mevcut stratejiyi uygulayıp biçimlendirilmiş sonucu döndüren bir process(String text) metodu olmalıdır.
  • main.dart: Biçimlendirme stratejilerinizi içe aktarın ve Strategy deseninin dinamik davranış değiştirmeyi nasıl sağladığını gösterin. TextProcessor ile başlayan bir UppercaseStrategy oluşturun. hello world metnini işleyin ve sonucu yazdırın. Ardından LowercaseStrategy stratejisine geçin, HELLO WORLD metnini işleyin ve yazdırın. Son olarak TitleCaseStrategy stratejisine geçin, the quick brown fox metnini işleyin ve sonucu yazdırın.

Bu, Strategy deseninin gücünü gösterir: TextProcessor biçimlendirmenin nasıl çalıştığına ilişkin ayrıntıları bilmek zorunda değildir. Yalnızca o anda ayarlanmış olan stratejiye devreder; böylece işlemciyi değiştirmeden yeni biçimlendirme seçenekleri eklemek kolaylaşır!

Beklenen çıktı:

HELLO WORLD
hello world
The Quick Brown Fox

Kendin dene

import 'formatting_strategies.dart';

void main() {
  // TODO: UppercaseStrategy ile başlayan bir TextProcessor oluşturun
  
  // TODO: 'hello world' metnini işleyin ve sonucu yazdırın
  
  // TODO: LowercaseStrategy'ye geçiş yapın
  
  // TODO: 'HELLO WORLD' metnini işleyin ve sonucu yazdırın
  
  // TODO: TitleCaseStrategy'ye geçiş yapın
  
  // TODO: 'the quick brown fox' metnini işleyin ve sonucu yazdırın
}
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 Dart derleyicisi