当前位置: 首页 > news >正文

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())

解释

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

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

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

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

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

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


完整可运行的代码库

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())```

相关文章:

  • 机器学习经典算法:用决策树原理优化新能源汽车续航能力
  • 【Redis】String详细介绍及其应用场景
  • 深度学习系统学习系列【1】之基本知识
  • npm宿主依赖、宿主环境依赖(peerDependencies)(指由宿主环境提供的依赖)
  • Ubuntu20.04如何优雅的安装ROS 1(胎教级教程)
  • Ocelot与.NETcore7.0部署(基于腾讯云)
  • loads、dumps、jsonpath使用场景
  • 上位机知识篇---二进制操作
  • 科学养生,解锁健康生活密码
  • 【信息系统项目管理师-论文真题】2023下半年论文详解(包括解题思路和写作要点)
  • 【DeepMLF】具有可学习标记的多模态语言模型,用于情感分析中的深度融合
  • npm命令介绍(Node Package Manager)
  • 2025五一杯数学建模竞赛B题 矿山数据处理 保姆级教程讲解|模型讲解
  • 2025五一杯数学建模ABC题赛题已出
  • SpringAI系列 - 升级1.0.0-M8
  • VBA数据库解决方案第二十讲:Select From Where条件表达式
  • CMake中的“包管理“模块FetchContent
  • 2025五一数学建模竞赛B题完整分析论文(共42页)(含模型、可运行代码、数据)
  • 【CV数据集】DIOR遥感目标检测数据集(含处理好的YOLO、COCO、VOC格式和相关配置文件下载链接)
  • 数字智慧方案5971丨智慧农业大数据平台解决方案(59页PPT)(文末有下载方式)
  • wordpress管理地址/网站的优化
  • 电商网站开发哪家好/郑州seo网站排名
  • 公司网站管理规定/seo优化教程自学网
  • 网站建设对网络营销的影响/360关键词排名百度
  • 凡科网免费网站怎么样/网络推广和信息流优化一样么
  • 网站建设跟网站开发有什么区别吗/seo在线教学