设计模式-策略模式

概念

策略模式主要是定义一系列算法,把它们封装起来,并且使它们可以互相替换。这样客户端可以根据需要选择不同的策略,而不需要改变使用策略的上下文。

策略模式的核心思想:

  1. 解耦策略定义:把各种支付方式(策略)单独封装成类
  2. 动态切换策略:收银台(上下文)不关心具体支付方式,只管调用统一的支付接口
  3. 开闭原则:新增支付方式时,不需要修改现有代码(比如不用改收银台的代码)

优势:

  1. 相比于简单工厂模式,避免大量if-else判断/switch语句的使用,直接实例化和调用,也不需要和简单工厂模式新增一个类的时候还要修改工厂类。
  2. 方便扩展新策略
  3. 策略实现可以独立变化
  4. 运行时自由切换算法

具体实现:

python 复制代码
# 策略接口:支付方式
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期免息

适用场景:

  • 超市购物不同的打折算法的实现
  • 支付方式选择
  • 导航路线计算(开车/步行/公交)
  • 数据压缩算法选择
  • 游戏角色技能切换
相关推荐
倔强青铜三22 分钟前
苦练Python第13天:变量作用域、全局变量与局部变量
人工智能·python·面试
青衫客3622 分钟前
浅谈 Python 中的 yield——生成器对象与函数调用的区别
开发语言·python
von Neumann23 分钟前
系统学习Python——并发模型和异步编程:基础实例-[使用进程实现旋转指针]
python·线程·进程·并发·协程·异步·多进程
apihz26 分钟前
腾讯云轻量服务器创建快照免费API接口教程
android·服务器·数据库·python·网络协议·tcp/ip·腾讯云
爱分享的飘哥27 分钟前
《【第八篇-图片总结篇】Python图片处理自动化:终极工厂!从裁剪压缩到智能加水印,打造你的视觉内容生产流水线!》
python·办公自动化·自动化脚本·python图片处理·图片自动化·python实战
小张在编程37 分钟前
Java设计模式实战:备忘录模式与状态机模式的“状态管理”双雄
java·设计模式·备忘录模式
倔强青铜三41 分钟前
苦练Python第12天:函数三板斧,def、return、参数
人工智能·python·面试
倔强青铜三1 小时前
苦练Python第11天:循环控制——break、continue 和 pass
人工智能·python·面试
chao_7891 小时前
Selenium 操作表单选择控件【selenium】
运维·python·selenium·测试工具·自动化
贝塔西塔1 小时前
PySpark中python环境打包和JAR包依赖
大数据·开发语言·python·spark·jar·pyspark