找回密码
 立即注册
首页 业界区 业界 python策略模式场景

python策略模式场景

毕余馥 2025-6-6 09:34:57
什么是策略模式?

在Python中,除了上次介绍的工厂模式,还有一种应用广泛的设计模式,即策略模式。策略模式就是一个策略类,它可以用相同的接口来调用不同的策略类,从而实现不同策略下的算法。
策略模式一般由三个部分组成:

  • Context:上下文类,持有具体策略类的实例,并负责调用相关的算法
  • Strategy:策略抽象类,用来约束一系列的策略算法(Context 使用这个接口来调用具体的策略实现算法)
  • ConcreateStrategy:具体的策略类(继承抽象策略类)
何时选择策略模式?

如果一件事的行为可以在不同的环境下有不同的表现,那么就可以使用策略模式。
举个例子:
比如APP的分享,它可以是微信分享,QQ分享,微博分享,各种分享所要输出的内容不一样,所以可以使用策略模式来实现不同的分享。
再比如出门旅游,可以自驾、坐高铁、坐飞机,这种属于出行策略。
策略模式的应用

今天分享的策略模式应用场景是线上网购折扣场景。
日常网购各种折扣,礼金,满减等等折扣场景十分广泛,这些折扣可以用策略模式来实现。
我们遵循策略模式的三个部分来展开这次需求:
Context

上下文类,持有具体策略类的实例,并负责调用相关的算法
  1. class Customer:
  2.     """顾客类"""
  3.     def __init__(self, name, integral, is_vip):
  4.         self.name = name
  5.         self.integral = integral
  6.         self.is_vip = is_vip
  7.     def __repr__(self):
  8.         return self.name
  9. class Goods:
  10.     """商品类"""
  11.     def __init__(self, name, price, num):
  12.         self.name = name
  13.         self.price = price
  14.         self.num = num
  15.     def total(self):
  16.         return self.price * self.num
  17. class Order:
  18.     """
  19.     订单类
  20.     关联上用户、对应的商品、折扣策略
  21.     通过折扣策略来计算订单的实际价格
  22.     """
  23.     def __init__(self, customer, promotion=None):
  24.         """
  25.         :param customer: 顾客对象
  26.         :param promotion: 折扣策略对象
  27.         """
  28.         self.cart = []  # 购物车
  29.         self.customer = customer  # 客户信息
  30.         self.promotion = promotion  # 具体的折扣策略
  31.     def add_cart(self, *good):
  32.         """商品加入购物车"""
  33.         self.cart += good
  34.     def total(self):
  35.         """计算购物车商品总价"""
  36.         return sum(map(lambda x: x.total(), self.cart))
  37.     def due(self):
  38.         """计算商品具体折扣后价格"""
  39.         if self.promotion is None:
  40.             return self.total()
  41.         return self.total() - self.promotion.discount(self)
  42.     def __repr__(self):
  43.         return f"<{self.customer} Order total:{self.total()} due:{self.due()}>"
复制代码
Strategy

策略抽象类,用来约束一系列的策略算法。
  1. class Promotion(ABC):
  2.     """折扣策略基类"""
  3.     def discount(self, order):
  4.         """计算折扣后的价格"""
  5.         raise NotImplementedError
复制代码
未来我们具体实现的折扣策略必须是继承自Promotion的子类,并实现discount方法。
ConcreateStrategy

具体的折扣策略
  1. class NoPromotion(Promotion):
  2.     """不打折"""
  3.     def discount(self, order):
  4.         return 0  
  5. class RatePromotion(Promotion):
  6.     """按比例打折"""
  7.     def __init__(self, rate):
  8.         self.rate = rate
  9.     def discount(self, order):
  10.         return order.total() * (1 - self.rate)
复制代码
可以观察到,我们使用Promotion作为子类的约束,而RatePromotion是具体的折扣策略。
通过Order类来协同消费者、商品、折扣策略,实现订单的折扣计算。
  1. # 创建三个商品
  2. good1 = Goods('apple', 10, 1)
  3. good2 = Goods('banana', 20, 2)
  4. good3 = Goods('orange', 30, 3)
  5. # 创建一个消费者
  6. customer = Customer('米乐', 100, False)
  7. # 将消费者和折扣绑定到订单上
  8. order = Order(
  9.   customer=customer,
  10.   promotion=RatePromotion(0.8)
  11. )
  12. # 将商品添加到订单中
  13. order.add_cart(good1, good2, good3)
  14. print(order)
  15. # <米乐 Order total:140 due:112.0>
复制代码
有一天领导又准备搞一个满100减10的活动,我们可以这样来实现:
  1. class FullReductionPromotion(Promotion):
  2.     """满减"""
  3.     def __init__(self, full, reduction):
  4.         self.full = full
  5.         self.reduction = reduction
  6.     def discount(self, order):
  7.         return order.total() // self.full * self.reduction
复制代码
  1. order = Order(
  2.         customer=customer,
  3.         promotion=FullReductionPromotion(100, 10)
  4. )
  5. print(order)
  6. # <米乐 Order total:140 due:130>
复制代码
以上就是笔者对策略模式的理解及应用场景的实现。

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册