策略模式和状态模式都是设计模式中的经典之作。策略模式定义了一个拥有共同行为的算法族,每个算法都被封装起来,可以互相替换,独立于客户端而变化。策略模式本身的实现比较简单,但是结合单例模式+简单工厂模式+注解+反射,可以构造出近乎完善的策略模式,彻底的消除if-else。,,状态模式是一种行为型设计模式,用于处理对象在内部状态改变时,改变其行为的场景。状态模式通过将对象的状态转换为不同的状态来实现不同的行为。
策略模式是一种行为型设计模式,它定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,策略模式让算法独立于使用它的客户端,这使得算法可以独立于使用它的客户端进行变化,而不需要修改客户端的代码。
策略模式的主要角色有:
1、抽象策略(Strategy):定义所有支持的算法的公共接口。
2、具体策略(ConcreteStrategy):实现抽象策略中的操作,为每一个具体问题提供一个具体的解法。
3、上下文(Context):持有一个策略类的引用,需要在运行时知道当前使用的策略类型。
下面我们通过一个简单的例子来说明策略模式的使用,假设我们有一个电商系统,需要根据不同的促销活动计算折扣后的价格,我们可以使用策略模式来实现这个功能。
我们需要定义一个抽象策略类,用于表示折扣策略:
from abc import ABC, abstractmethod class DiscountStrategy(ABC): @abstractmethod def calculate_discounted_price(self, original_price, discount): pass
我们可以定义两个具体策略类,分别表示满减和满赠的折扣策略:
class FullReductionStrategy(DiscountStrategy): def calculate_discounted_price(self, original_price, discount): return original_price * (1 - discount) class FullGiftStrategy(DiscountStrategy): def calculate_discounted_price(self, original_price, discount): return original_price * (1 - discount + discount / 100)
我们需要定义一个上下文类,用于保存当前使用的折扣策略:
class ShoppingCart: def __init__(self): self.strategy = None
我们可以在购物车中设置不同的折扣策略,并计算折扣后的价格:
cart = ShoppingCart() cart.set_strategy(FullReductionStrategy()) original_price = 1000 discount = 10 print("满减后价格:", cart.strategy.calculate_discounted_price(original_price, discount)) cart.set_strategy(FullGiftStrategy()) print("满赠后价格:", cart.strategy.calculate_discounted_price(original_price, discount))
通过策略模式,我们可以轻松地切换不同的折扣策略,而不需要修改客户端的代码,当需要添加新的促销活动时,只需要实现一个新的折扣策略类即可。