python简单学 策略模式【Strategy Pattern】

在软件开发中,我们经常会遇到需要在多种算法之间选择和切换的情况,这时候策略模式就可以派上用场。本文将介绍策略模式的概念、工作原理、优点和缺点,以及何时使用它,并通过具体的示例来说明。

什么是策略模式?

策略模式是一种行为型设计模式,它定义了一系列算法,并将每个算法封装成单独的策略类,使得它们可以相互替换,而不影响客户端的使用。策略模式将算法的使用和算法的实现分离开来,使得客户端可以根据需要灵活地选择和切换不同的算法。

如何工作?

策略模式包含以下几个主要角色:

  1. 策略接口(Strategy):定义了一个算法族的公共接口,所有具体策略类都实现了这个接口。

  2. 具体策略类(Concrete Strategy):实现了策略接口,封装了具体的算法。

  3. 环境类(Context):维护一个对策略接口的引用,用于调用具体的算法。通常还提供了一个方法,允许客户端在运行时切换不同的策略。

优点

  • 灵活性:策略模式允许客户端在运行时选择和切换不同的算法,从而提供了更大的灵活性和可扩展性。
  • 可维护性:由于每个算法都被封装在单独的策略类中,使得算法的修改和维护更加容易,不会影响到其他部分的代码。

缺点

  • 增加类的数量:引入策略模式可能会增加系统中类的数量,因为每个具体算法都需要一个单独的策略类来实现。

何时使用?

  • 当一个类有多个行为,而且这些行为在不同的情况下需要不同的实现时,可以考虑使用策略模式。
  • 当需要在运行时动态选择算法时,策略模式也是一个很好的选择。

示例说明

假设我们有一个简单的商场收银系统,根据不同的促销活动(例如打折、满减等)计算商品的最终价格。我们可以使用策略模式来实现这一功能,将每种促销活动封装成单独的策略类,并在需要时灵活地选择和切换不同的促销策略。

代码示例

下面是一个简单的Python代码示例,演示了如何使用策略模式来实现商场收银系统:
 

from abc import ABC, abstractmethod

# 策略接口
class CashStrategy(ABC):
    @abstractmethod
    def calculate_price(self, price):
        pass

# 具体策略类 - 正常收费
class NormalCash(CashStrategy):
    def calculate_price(self, price):
        return price

# 具体策略类 - 打折
class DiscountCash(CashStrategy):
    def __init__(self, discount_rate):
        self.discount_rate = discount_rate

    def calculate_price(self, price):
        return price * self.discount_rate

# 具体策略类 - 满减
class FullReductionCash(CashStrategy):
    def __init__(self, full_price, reduction):
        self.full_price = full_price
        self.reduction = reduction

    def calculate_price(self, price):
        if price >= self.full_price:
            return price - self.reduction
        else:
            return price

# 环境类 - 商场收银系统
class Cashier:
    def __init__(self, strategy):
        self.strategy = strategy

    def set_strategy(self, strategy):
        self.strategy = strategy

    def calculate_final_price(self, price):
        return self.strategy.calculate_price(price)

# 客户端代码
if __name__ == "__main__":
    # 创建商场收银系统对象
    cashier = Cashier(NormalCash())

    # 计算不同策略下的最终价格
    print("Normal price:", cashier.calculate_final_price(100))  # 输出 "Normal price: 100"
    
    cashier.set_strategy(DiscountCash(0.8))
    print("Discount price:", cashier.calculate_final_price(100))  # 输出 "Discount price: 80"
    
    cashier.set_strategy(FullReductionCash(200, 50))
    print("Full reduction price:", cashier.calculate_final_price(150))  # 输出 "Full reduction price: 150"


-------------------------
输出:
Normal price: 100
Discount price: 80.0
Full reduction price: 150

在这个示例中,Cashier 类充当了环境类,负责维护当前使用的促销策略,并根据需要调用相应的策略来计算最终价格。NormalCashDiscountCashFullReductionCash 分别充当了具体策略类,实现了不同的促销算法。这样,商场收银系统就实现了策略模式,根据选择的不同促销策略来计算最终价格。

  • 8
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值