概念
策略模式主要是定义一系列算法,把它们封装起来,并且使它们可以互相替换。这样客户端可以根据需要选择不同的策略,而不需要改变使用策略的上下文。
策略模式的核心思想:
- 解耦策略定义:把各种支付方式(策略)单独封装成类
- 动态切换策略:收银台(上下文)不关心具体支付方式,只管调用统一的支付接口
- 开闭原则:新增支付方式时,不需要修改现有代码(比如不用改收银台的代码)
优势:
- 相比于简单工厂模式,避免大量if-else判断/switch语句的使用,直接实例化和调用,也不需要和简单工厂模式新增一个类的时候还要修改工厂类。
- 方便扩展新策略
- 策略实现可以独立变化
- 运行时自由切换算法
具体实现:
# 策略接口:支付方式
class PaymentStrategy:
def pay(self, amount):
pass
# 具体策略类:支付宝支付
class AlipayStrategy(PaymentStrategy):
def pay(self, amount):
print(f"支付宝支付:{amount}元,使用花呗付款")
# 具体策略类:微信支付
class WechatPayStrategy(PaymentStrategy):
def pay(self, amount):
print(f"微信支付:{amount}元,零钱余额不足请换卡支付")
# 具体策略类:银行卡支付
class BankCardStrategy(PaymentStrategy):
def pay(self, amount):
print(f"银行卡支付:{amount}元,尾号8866的储蓄卡")
# 上下文类:收银台
class CheckoutCounter:
def __init__(self):
self._strategy = None # 当前支付策略
def set_strategy(self, strategy):
"""动态切换支付策略"""
self._strategy = strategy
def checkout(self, amount):
"""执行支付"""
if self._strategy:
self._strategy.pay(amount)
else:
print("请先选择支付方式")
# 使用示例
counter = CheckoutCounter()
# 顾客选择支付宝支付
counter.set_strategy(AlipayStrategy())
counter.checkout(100) # 输出:支付宝支付:100元,使用花呗付款
# 顾客临时改用微信支付
counter.set_strategy(WechatPayStrategy())
counter.checkout(200) # 输出:微信支付:200元,零钱余额不足请换卡支付
# 突然新增一个支付方式(不影响原有代码)
class CreditCardStrategy(PaymentStrategy):
def pay(self, amount):
print(f"信用卡支付:{amount}元,享受12期免息")
counter.set_strategy(CreditCardStrategy())
counter.checkout(300) # 输出:信用卡支付:300元,享受12期免息
适用场景:
- 超市购物不同的打折算法的实现
- 支付方式选择
- 导航路线计算(开车/步行/公交)
- 数据压缩算法选择
- 游戏角色技能切换