Python10天冲刺-设计模型之策略模式
策略模式是一种行为设计模式,它允许你在运行时动态地改变对象的行为。这种模式的核心思想是将一组相关的算法封装在一起,并让它们相互替换。
下面是使用 Python 实现策略模式的一个示例:
示例代码
假设我们有一个简单的购物车系统,其中不同的支付方式有不同的折扣策略。我们将使用策略模式来实现这一功能。
1. 定义抽象基类(策略接口)
from abc import ABC, abstractmethodclass PaymentStrategy(ABC):@abstractmethoddef pay(self, amount):pass
2. 具体策略实现
class CreditCardPayment(PaymentStrategy):def pay(self, amount):print(f"Paying ${amount} with credit card.")return f"${amount} paid using credit card."class PayPalPayment(PaymentStrategy):def pay(self, amount):print(f"Paying ${amount} with PayPal.")return f"${amount} paid using PayPal."
3. 上下文类
上下文类负责使用具体的策略来进行支付。
class ShoppingCart:def __init__(self, payment_strategy: PaymentStrategy):self._items = []self.payment_strategy = payment_strategydef add_item(self, item):self._items.append(item)def calculate_total(self):return sum(item['price'] for item in self._items)def checkout(self):total_amount = self.calculate_total()return self.payment_strategy.pay(total_amount)
4. 测试策略模式
if __name__ == "__main__":cart = ShoppingCart(CreditCardPayment())cart.add_item({'name': 'Shirt', 'price': 20})cart.add_item({'name': 'Pants', 'price': 30})print(cart.checkout())cart = ShoppingCart(PayPalPayment())cart.add_item({'name': 'Shoes', 'price': 50})cart.add_item({'name': 'Hat', 'price': 15})print(cart.checkout())
解释
-
抽象基类(策略接口):
PaymentStrategy
类定义了一个抽象方法pay
,这是所有具体策略必须实现的方法。
-
具体策略实现:
CreditCardPayment
和PayPalPayment
分别实现了pay
方法,提供了不同的支付逻辑。
-
上下文类:
ShoppingCart
类持有一个payment_strategy
属性,用于存放具体的支付策略。checkout
方法计算总金额并调用当前策略的pay
方法。
-
测试策略模式:
- 创建两个
ShoppingCart
对象,分别使用CreditCardPayment
和PayPalPayment
策略。 - 添加商品并结算,观察不同支付策略的结果。
- 创建两个
通过这种方式,你可以灵活地切换不同的支付策略,而无需修改上下文类的代码。这就是策略模式的主要优点之一。
完整可运行的代码库
from abc import ABC, abstractmethod# 抽象基类(策略接口)
class PaymentStrategy(ABC):@abstractmethoddef pay(self, amount):pass# 具体策略实现
class CreditCardPayment(PaymentStrategy):def pay(self, amount):print(f"Paying {amount} using credit card.")return f"{amount} paid using credit card."class PayPalPayment(PaymentStrategy):def pay(self, amount):print(f"Paying {amount} using PayPal.")return f"{amount} paid using PayPal."# 上下文类
class ShoppingCart:def __init__(self, payment_strategy: PaymentStrategy):self.items = []self.payment_strategy = payment_strategydef add_item(self, item):self.items.append(item)def remove_item(self, item):self.items.remove(item)def calculate_total(self):return sum(item['price'] for item in self.items)def checkout(self):total_amount = self.calculate_total()return self.payment_strategy.pay(total_amount)if __name__ == "__main__":cart = ShoppingCart(CreditCardPayment())cart.add_item({'name': 'Shirt', 'price': 20})cart.add_item({'name': 'Pants', 'price': 30})print(cart.checkout())cart = ShoppingCart(PayPalPayment())cart.add_item({'name': 'Shoes', 'price': 50})cart.add_item({'name': 'Hat', 'price': 15})print(cart.checkout())```