Strategy Kalıbı
Coddy'nin Python Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 48 / 64.
Strateji Kalıbı, bir algoritma ailesi tanımlar, her birini kapsüller ve birbirlerinin yerine kullanılabilmelerini sağlar. İstemci kodunu değiştirmeden çalışma zamanında algoritmalar arasında geçiş yapabilirsin.
Farklı ödeme yöntemleri için basit strateji sınıfları şunlardır:
class CreditCard:
def pay(self, amount):
return f"Paid ${amount} with Credit Card"
class PayPal:
def pay(self, amount):
return f"Paid ${amount} with PayPal"
class Bitcoin:
def pay(self, amount):
return f"Paid ${amount} with Bitcoin"Her strateji aynı yöntemi (pay) uygular ancak farklı davranır.
Stratejileri kullanan bir bağlam sınıfı oluştur:
class ShoppingCart:
def __init__(self):
self.total = 0
self.payment_strategy = None
def add_item(self, price):
self.total += price
def set_payment_strategy(self, strategy):
self.payment_strategy = strategy
def checkout(self):
return self.payment_strategy.pay(self.total)Bağlam sınıfı, farklı ödeme stratejileri arasında geçiş yapabilir.
Strateji desenini kullan:
cart = ShoppingCart()
cart.add_item(50)
cart.add_item(30)
# Kredi kartı stratejisini kullan
cart.set_payment_strategy(CreditCard())
print(cart.checkout())
# PayPal stratejisine geç
cart.set_payment_strategy(PayPal())
print(cart.checkout())Sıralama stratejileriyle başka bir örnek oluştur:
class BubbleSort:
def sort(self, data):
return f"Bubble sorted: {sorted(data)}"
class QuickSort:
def sort(self, data):
return f"Quick sorted: {sorted(data)}"
class Sorter:
def __init__(self, strategy):
self.strategy = strategy
def set_strategy(self, strategy):
self.strategy = strategy
def sort_data(self, data):
return self.strategy.sort(data)
# Farklı sıralama stratejileri kullanın
numbers = [3, 1, 4, 1, 5]
sorter = Sorter(BubbleSort())
print(sorter.sort_data(numbers))
sorter.set_strategy(QuickSort())
print(sorter.sort_data(numbers))Çıktı:
Paid $80 with Credit Card
Paid $80 with PayPal
Bubble sorted: [1, 1, 3, 4, 5]
Quick sorted: [1, 1, 3, 4, 5]Önemli Nokta: Strategy Pattern, algoritmaları çalışma zamanında değiştirmenizi sağlar. Aynı arayüzü kullanan farklı stratejiler tanımlayın, ardından bağlam sınıfının hangisini kullanacağını seçmesine izin verin. Bu, mevcut kodu değiştirmeden yeni algoritmalar ekleyerek kodunuzu esnek ve genişletilmesi kolay hâle getirir.
Görev
OrtaAlışveriş sistemimiz için yeni bir BitcoinPayment stratejisi uygulayın.
Göreviniz:
- PaymentStrategy'yi uygulayan bir BitcoinPayment sınıfı oluşturmak
- Yapıcıda bir wallet_address kabul etmelidir
- pay yöntemi tam olarak şunu yazdırmalıdır:
Paying $X using Bitcoin wallet: Y; burada X tutar, Y ise cüzdan adresidir - pay yöntemi yazdırdıktan sonra True döndürmelidir
- Şunları yapan bir main işlevi yazmak:
- Bir alışveriş sepeti oluşturur
- Sepete 1200 dolarlık bir dizüstü bilgisayar ve 100 dolarlık kulaklık ekler
- "1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa" cüzdan adresiyle bir BitcoinPayment oluşturur
- Bu ödeme stratejisini sepete ayarlar
- checkout yöntemini çağırır
Başlangıç kodunda en altta zaten if __name__ == "__main__": bulunuyor. Bunu kendiniz eklemeniz gerekmez. Bu, main() işlevinizin yalnızca dosya doğrudan çalıştırıldığında (başka bir modül tarafından içe aktarılmadığında) çalışmasını sağlayan bir Python geleneğidir. Yalnızca main() işlevinizi tanımlayın; sağlanan blok onu otomatik olarak çağıracaktır.
Ders örneklerinde gösterilen yapının aynısını izleyin.
Kendin dene
from abc import ABC, abstractmethod
class PaymentStrategy(ABC):
@abstractmethod
def pay(self, amount):
pass
class CreditCardPayment(PaymentStrategy):
def __init__(self, card_number, expiry_date, cvv):
self.card_number = card_number
self.expiry_date = expiry_date
self.cvv = cvv
def pay(self, amount):
print(f"Paying ${amount} using Credit Card: {self.card_number}")
return True
class PayPalPayment(PaymentStrategy):
def __init__(self, email, password):
self.email = email
self.password = password
def pay(self, amount):
print(f"Paying ${amount} using PayPal account: {self.email}")
return True
class ShoppingCart:
def __init__(self):
self.items = []
self.payment_strategy = None
def add_item(self, item, price):
self.items.append({"item": item, "price": price})
def set_payment_strategy(self, payment_strategy):
self.payment_strategy = payment_strategy
def checkout(self):
total = sum(item["price"] for item in self.items)
if self.payment_strategy:
return self.payment_strategy.pay(total)
else:
raise ValueError("No payment strategy set")
# BitcoinPayment strateji sınıfınızı burada oluşturun
if __name__ == "__main__":
main()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 Yönelimli Programlamanın Temelleri
Nesne Yönelimli Programlamaya GirişHarici DosyalarSınıflar ve Nesnelerself ParametresiMetotlarÖzniteliklerKurucu Metot (__init__)Tekrar - Basit Hesap Makinesi4Kalıtım
Temel Kalıtımsuper() FonksiyonuMetot Geçersiz KılmaÇoklu KalıtımMetot Çözümleme SırasıÖzet - Çalışan Hiyerarşisi7Özel Metotlar
Sihirli Metotlara GirişOperatör Aşırı YüklemeKapsayıcı Sihirli MetotlarıÖzet - Özel Liste10Tasarım Kalıpları Bölüm 1
Tasarım kalıplarına girişSingleton KalıbıFactory KalıbıObserver KalıbıStrategy Kalıbı13Final Meydan Okumaları
E-öğrenme PlatformuBankacılık SistemiOyun Karakteri GeliştirmeAraç Kiralama Servisi5Çok Biçimlilik (Polymorphism)
Metot Geçersiz Kılmaya Yeniden BakışDuck TypingSoyut Sınıflar ve MetotlarArayüz TasarımıÖzet - Şekil Hesaplayıcı8İleri Düzey OOP Kavramları
Kompozisyon ve KalıtımMixinsStatik ve Sınıf MetotlarıSınıf DekoratörleriBağlam Yöneticileri11Tasarı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ıKendi başına pratik yap: Online Python derleyicisi