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.
Görev
KolayStrategy 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.FormattingStrategyadlı,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ürLowercaseStrategy- metni tamamen küçük harfe dönüştürürTitleCaseStrategy- 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)
TextProcessortutanFormattingStrategysı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 birsetStrategy()metodu ve mevcut stratejiyi uygulayıp biçimlendirilmiş sonucu döndüren birprocess(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.TextProcessorile başlayan birUppercaseStrategyoluşturun.hello worldmetnini işleyin ve sonucu yazdırın. ArdındanLowercaseStrategystratejisine geçin,HELLO WORLDmetnini işleyin ve yazdırın. Son olarakTitleCaseStrategystratejisine geçin,the quick brown foxmetnini 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 FoxKendin 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
}
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
1Nesne Tabanlı Programlamanın Temelleri
Harici DosyalarKütüphaneler ve İçe AktarmalarOOP'ye GirişSınıflar ve Nesnelerthis Anahtar SözcüğüMetotlarÖrnek DeğişkenleriYapıcıların TemelleriTekrar - Basit Hesap Makinesi4Null Güvenliği
Null Güvenliğine GirişNullable ve Non-Nullable? ve ! OperatörleriLate Anahtar Sözcüğü ve Null GüvenliğiNull-Aware OperatörlerSınıflarda Null GüvenliğiTekrar - Kullanıcı Profili Sistemi7Soyut Sınıflar ve Arayüzler
Soyut SınıflarSoyut MetotlarDart'ta ArayüzlerÖrtük ArayüzlerUygulamak ve GenişletmekBirden Çok ArayüzTekrar - Şekil Hesaplayıcı10Koleksiyonlar ve Generics
List, Set, Map Genel BakışTür Güvenli KoleksiyonlarGeneric SınıflarGeneric MetotlarGeneric KısıtlamalarIterable ve IteratorTekrar - Generic Depolama2Dart'ta Yapıcılar
Varsayılan YapıcıAdlandırılmış YapıcılarBaşlatıcı ListeleriSabit YapıcılarFabrika YapıcılarıYönlendiren YapıcılarÖzet - Şekil Oluşturucu5Kapsülleme
Public ve Private Üyeler_ Ön Ek KuralıKütüphane Düzeyinde GizlilikGetter ve Setter DerinliğiBilgi GizlemeTekrar - Öğrenci Kayıtları8Mixin'ler
Mixin'lere GirişMixin OluşturmaBirden Çok Mixin KullanımıMixin'lerde on Anahtar SözcüğüMixin ve Kalıtım KarşılaştırmasıMixin ve Arayüz KarşılaştırmasıÖzet - Hayvan Sistemi11Özel Metotlar
toString() Geçersiz KılmahashCode & == Geçersiz KılmaComparable Arayüzücall() MetodunoSuchMethod Geçersiz KılmaÖzet - Özel Koleksiyon14Tasarım Desenleri Bölüm 1
Tasarım Desenlerine GirişSingleton DeseniFactory DeseniObserver DeseniStrategy Deseni3Sınıf Özellikleri
Örnek ve Static ÜyelerFinal ve Const AlanlarLate DeğişkenlerStatic Metotlar ve AlanlarGetter ve Setter'larÖzet - Banka Hesabı Yöneticisi6Kalıtım
Temel Kalıtımsuper Anahtar SözcüğüMetot Geçersiz Kılma@override Açıklamasıfinal Sınıf Anahtar SözcüğüKurucular ve KalıtımÖzet - Çalışan Hiyerarşisi9Çok Biçimlilik
Çok Biçimlilik TemelleriArayüzler Yoluyla Çok BiçimlilikÇalışma Zamanı Tür Denetimiis ve as OperatörleriCovariant Anahtar KelimesiTekrar - Ödeme İşlemcisi12Asenkron OOP
Future'ler ve async/awaitStream TemelleriStream DenetleyicileriAsenkron YapıcılarSınıf Metotlarında AsenkronlukÖzet - Veri Getirici15Tasarım Desenleri Bölüm 2
Komut DeseniAdaptör DeseniDekoratör DeseniŞablon Metot DeseniDurum DeseniBileşik DesenDepo DeseniKendi başına pratik yap: Online Dart derleyicisi