Python10天冲刺-设计模型之策略模式

策略模式是一种行为设计模式,它允许你在运行时动态地改变对象的行为。这种模式的核心思想是将一组相关的算法封装在一起,并让它们相互替换。

下面是使用 Python 实现策略模式的一个示例:

示例代码

假设我们有一个简单的购物车系统,其中不同的支付方式有不同的折扣策略。我们将使用策略模式来实现这一功能。

1. 定义抽象基类(策略接口)
python 复制代码
from abc import ABC, abstractmethod

class PaymentStrategy(ABC):
    @abstractmethod
    def pay(self, amount):
        pass
2. 具体策略实现
python 复制代码
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. 上下文类

上下文类负责使用具体的策略来进行支付。

python 复制代码
class ShoppingCart:
    def __init__(self, payment_strategy: PaymentStrategy):
        self._items = []
        self.payment_strategy = payment_strategy

    def 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. 测试策略模式
python 复制代码
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())

解释

  1. 抽象基类(策略接口):

    • PaymentStrategy 类定义了一个抽象方法 pay,这是所有具体策略必须实现的方法。
  2. 具体策略实现:

    • CreditCardPayment 和 PayPalPayment 分别实现了 pay 方法,提供了不同的支付逻辑。
  3. 上下文类:

    • ShoppingCart 类持有一个 payment_strategy 属性,用于存放具体的支付策略。
    • checkout 方法计算总金额并调用当前策略的 pay 方法。
  4. 测试策略模式:

    • 创建两个 ShoppingCart 对象,分别使用 CreditCardPayment 和 PayPalPayment 策略。
    • 添加商品并结算,观察不同支付策略的结果。

通过这种方式,你可以灵活地切换不同的支付策略,而无需修改上下文类的代码。这就是策略模式的主要优点之一。


完整可运行的代码库

python 复制代码
from abc import ABC, abstractmethod

# 抽象基类(策略接口)
class PaymentStrategy(ABC):
    @abstractmethod
    def 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_strategy

    def 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())```
相关推荐
程序员老陆几秒前
C++ 未定义行为全景:对象模型、优化边界与工程防御
开发语言·c++·程序设计
知几蜗牛3 分钟前
GPT-6 与 Intelligent UI:从回答到可审计操作的产品迁移
人工智能
蟕初的梦想4 分钟前
Claude Haiku 5.5 效能实测与场景应用指南
数据库·人工智能·大模型
liron719 分钟前
技术的诞生与演化--技术自举及其冷启动
人工智能·深度学习·神经网络·自然语言处理
知几蜗牛12 分钟前
Java 17 视觉识别结果的金额与字段门禁实现
人工智能
嘻嘻的AI日记13 分钟前
人工合规审查有盲区,智能合规如何补足文件风险识别短板
人工智能
UBIX泛联14 分钟前
机器人展风采,存储筑根基——泛联应邀参展电子科技大学70周年校庆展
人工智能·机器人·ai算力基础设施
嵌入式er14 分钟前
影石系统组 一二面OC面经
java·开发语言
徐小黑ACG15 分钟前
Golang 基础06 接口interface
开发语言·后端·golang
半杯咖啡半行码16 分钟前
Qt 开发基础:版本演进、常用工具与多平台安装
开发语言·qt