当前位置: 首页 > ai >正文

设计模式-策略模式

概念

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

策略模式的核心思想:

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

优势:

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

具体实现:

# 策略接口:支付方式
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 = strategydef 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期免息

适用场景:

  • 超市购物不同的打折算法的实现
  • 支付方式选择
  • 导航路线计算(开车/步行/公交)
  • 数据压缩算法选择
  • 游戏角色技能切换
http://www.xdnf.cn/news/4577.html

相关文章:

  • C++ 工具链与开发实践:构建安全、高效与创新的开发生态
  • C++之“继承”
  • C++面向对象编程入门:从类与对象说起(一)
  • 正则表达式实战指南:原理、口诀与高频场景案例
  • 如何在 C# 和 .NET 中打印 DataGrid
  • 【即插即用涨点模块】DSConv动态蛇形卷积:自适应聚焦细长弯曲的局部结构特征,助力分割高效提点【附源码+注释】
  • 【无标题】阿达萨达
  • 安卓基础(封装引用)
  • 视频编解码学习9之照相机历史
  • 【 Redis | 实战篇 短信登录 】
  • 区块链内容创作全攻略:海报、白皮书与视频的视觉化革命
  • idea出现tomcat不能正确部署的问题--解决方案
  • 用电信息采集中的天线种类
  • 链表的面试题4之合并有序链表
  • 大数据TopK问题
  • 什么是延迟队列?RabbitMQ 如何实现延迟队列?
  • 软件工程(五):设计模式
  • 【黑马程序员RabbitMQ高级】自用笔记
  • redis多路复用IO模型 以及 6.0引入的多线程模型
  • string[字符串中第一个的唯一字符][蓝桥杯]
  • 数据中台-常用工具组件:DataX、Flink、Dolphin Scheduler、TensorFlow和PyTorch等
  • Oracle 19c中的私有临时表
  • 不再踩坑!React.memo正确用法及性能优化实战
  • 【C++ Qt】多元素控件(ListWidget、TableWidget、TreeWidget)
  • 阿里云ddos云防护服务器有哪些功能?ddos防御手段有哪些??
  • 若依框架Ruoyi-vue整合图表Echarts中国地图标注动态数据
  • python调用国税乐企直连接口开数电票之查询税收分类编码信息
  • spring cloud alibaba nacos 服务注册
  • 远程桌面软件推荐
  • Java 中的 this 关键字完全指南:从原理到实战应用