Menu
CoddyTech

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.

challenge icon

Görev

Orta

Alışveriş sistemimiz için yeni bir BitcoinPayment stratejisi uygulayın.

Göreviniz:

  1. 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
  2. Ş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()
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 Python derleyicisi