策略模式和工厂模式都是设计模式中的一种,但是它们的关注点不同。工厂模式是创建型模式,关注对象的创建;而策略模式是行为型模式,关注行为的封装。在工厂模式中,我们可以通过一个工厂类来创建不同的对象,而在策略模式中,我们可以将算法封装、分离和替换,实现开闭原则 。
在计算机科学中,设计模式是一种被广泛接受的、可重用的解决方案,用于解决特定类型的软件设计问题,策略模式是这23种设计模式之一,它提供了一种在运行时选择算法的方法,使算法的变化独立于使用它的客户端,这种模式的主要目的是在不修改代码的情况下,增加或更改算法。
策略模式定义了一系列的算法,并将每一个算法封装起来,使它们可以相互替换,策略模式让算法的变化独立于使用它的客户端,在策略模式中,上下文(Context)持有一个策略类的引用,通过这个引用来调用具体策略类的方法。
下面我们来看一个简单的Python示例,以便更好地理解策略模式,假设我们有一个购物系统,需要根据用户的不同需求(如优惠券、积分等)计算商品的总价,我们可以使用策略模式来实现这个功能。
我们需要定义一个抽象策略类,表示计算总价的策略:
from abc import ABC, abstractmethod class TotalPriceStrategy(ABC): @abstractmethod def calculate(self, price, coupon_discount, points): pass
我们可以为每种优惠方式(如普通折扣、优惠券折扣、积分折扣等)创建具体的策略类:
class NormalDiscountStrategy(TotalPriceStrategy): def calculate(self, price, coupon_discount, points): return price * (1 - coupon_discount) + points class CouponDiscountStrategy(TotalPriceStrategy): def calculate(self, price, coupon_discount, points): return price * (1 - coupon_discount * 0.1) + points * 0.1 class PointsDiscountStrategy(TotalPriceStrategy): def calculate(self, price, coupon_discount, points): return price + points * 0.01
我们需要创建一个上下文类,用于保存当前使用的策略对象:
class ShoppingCart: def __init__(self): self.strategy = None def set_strategy(self, strategy): self.strategy = strategy def get_total_price(self, price, coupon_discount=0.1, points=0): if self.strategy is None: raise ValueError("No strategy set") return self.strategy.calculate(price, coupon_discount, points)
我们可以根据用户的选择设置不同的策略,并计算商品的总价:
if __name__ == "__main__": cart = ShoppingCart() cart.set_strategy(NormalDiscountStrategy()) print("Normal discount total price:", cart.get_total_price(100)) cart.set_strategy(CouponDiscountStrategy()) print("Coupon discount total price:", cart.get_total_price(100)) cart.set_strategy(PointsDiscountStrategy()) print("Points discount total price:", cart.get_total_price(100))
通过这个示例,我们可以看到策略模式的优点:当需要添加新的优惠方式时,我们只需要创建一个新的策略类,而不需要修改原有的代码,策略模式也使得算法的变化独立于使用它的客户端。