策略模式和工厂模式都是设计模式,但是它们的关注点不同。工厂模式关注的是对象的创建,而策略模式关注的是行为的封装 。,,工厂模式是一种创建型模式,它通过一个工厂类来创建对象。而策略模式则是一种行为型模式,它将算法封装成一个接口或抽象类,并在运行时动态地选择实现该接口或抽象类的具体策略 。
策略模式(Strategy Pattern)是一种行为型设计模式,它定义了一系列算法,并将每个算法封装在一个具有共同接口的独立类中,使得它们可以相互替换,策略模式让算法的变化独立于使用它们的客户端。
策略模式的主要角色有以下几个:
1、抽象策略(Strategy):定义所有支持的算法的公共接口。
2、具体策略(ConcreteStrategy):实现抽象策略中的操作,即具体的算法实现。
3、上下文(Context):持有一个策略类的引用,需要在运行时知道具体使用哪个策略。
4、客户端(Client):使用上下文对象来调用具体策略的方法。
下面我们通过一个简单的例子来说明策略模式的使用:
假设我们有一个电商平台,需要根据不同的折扣策略计算商品的价格,我们可以使用策略模式来实现这个功能。
我们需要定义一个抽象策略类,用于表示折扣策略:
from abc import ABC, abstractmethod class DiscountStrategy(ABC): @abstractmethod def calculate_price(self, price, discount): pass
我们可以实现具体的折扣策略,例如满减、满折等:
class FullReductionStrategy(DiscountStrategy): def calculate_price(self, price, discount): return price * (1 - discount) class FullDiscountStrategy(DiscountStrategy): def calculate_price(self, price, discount): return price * discount
我们需要定义一个上下文类,用于存储当前使用的折扣策略:
class PriceCalculatorContext: def __init__(self, strategy: DiscountStrategy): self._strategy = strategy @property def strategy(self): return self._strategy @strategy.setter def strategy(self, strategy: DiscountStrategy): self._strategy = strategy
我们可以在客户端代码中使用上下文对象来调用具体策略的方法:
if __name__ == "__main__": price = float(input("请输入商品原价:")) discount = float(input("请输入折扣率(0-1):")) context = PriceCalculatorContext(FullReductionStrategy()) price = context.strategy.calculate_price(price, discount) print("使用满减策略后的价格为:", price)
通过这个例子,我们可以看到策略模式的优势:当需要添加新的折扣策略时,我们只需要实现一个新的具体策略类,而不需要修改客户端代码,这样可以降低代码的耦合度,提高可维护性。