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. 具体策略实现

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

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

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

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


完整可运行的代码库

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())```
相关推荐
__Wedream__3 分钟前
ICPR 2022 多教师知识蒸馏技术应用于图像超分辨率重建——MTKDSR
图像处理·人工智能·深度学习·超分辨率重建·图像复原和增强
元岳数字人小元6 分钟前
数字人开源技术优势解析,助力智能交互普及落地
运维·人工智能·开源·人机交互·交互
一夜白头催人泪14 分钟前
从0到1搭建AI驱动的UI自动化:无代码DOM设计文档
人工智能·ui·自动化
似璟如你25 分钟前
Java 开发者的 Go 语法基础:从 0 开始快速上手 Go
java·开发语言·后端·golang·go·编程语言
ACP广源盛1392462567330 分钟前
Ling‑3.0‑flash 昇腾 0‑Day 适配落地@ACP#IX9104 在国产高密度算力矩阵中的机遇与落地场景
大数据·人工智能·分布式·单片机·嵌入式硬件
JXJD200438 分钟前
AI 推理服务器高速连接器线束自动化设备定制指南 全场景互连非标整线方案参考
服务器·人工智能·自动化
LccKyI39 分钟前
C#学习day05(开发福彩双色球系统附思维导图)
开发语言·学习·c#
zzz_236841 分钟前
TencentDB-Agent-Memory 深度解析:让多个 Agent 共享项目经验的记忆中枢
java·开发语言·jvm·人工智能·agent·memory·tencent db
DeepVisionary44 分钟前
再观察小星火:当大厂分成“冰封“,国产轻模式创作者平台如何跑出加速度
python·自动化
gb42152871 小时前
python中unstructured库和langchain-unstructured库在解析pdf文件的时候的区别?
python·langchain·pdf