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

Python 重构“策略”模式:用函数简化设计模式的实践

在软件设计中,设计模式是解决问题的通用模板。但随着编程语言特性的发展,某些经典模式可以通过更简洁的方式实现。本文以电商促销折扣场景为例,演示如何通过函数重构“策略”模式,减少代码量并提升可维护性。

经典策略模式实现

  • 核心概念
    上下文(Context):订单(Order)类,负责计算总价和应用折扣。
  • 策略接口(Strategy):
    抽象类Promotion,定义discount方法。
  • 具体策略(Concrete Strategies):
    三个子类分别实现不同折扣规则。
class Promotion(ABC):@abstractmethod def discount(self, order):"""返回折扣金额(正值)"""class FidelityPromo(Promotion):def discount(self, order):return order.total()  * .05 if order.customer.fidelity  >= 1000 else 0 
  • 实现特点
    每个策略类仅包含一个方法,且无状态。
    需手动实例化策略对象并传递给订单。

函数重构策略模式

  • 核心思想
    将策略类转换为函数,利用Python的一等函数特性简化代码:
def fidelity_promo(order):return order.total()  * .05 if order.customer.fidelity  >= 1000 else 0 def bulk_item_promo(order):discount = 0 for item in order.cart: if item.quantity  >= 20:discount += item.total()  * .1return discount 

优势对比

经典模式函数重构
需定义抽象类和多个子类直接使用函数
每次使用需实例化对象函数即用即调
代码行数:40+行代码行数:28行

动态选择最佳策略

简单实现

通过遍历函数列表计算最大折扣:

promos = [fidelity_promo, bulk_item_promo, large_order_promo]
def best_promo(order):return max(promo(order) for promo in promos)

动态收集策略

利用模块内省自动发现所有策略函数:

from inspect import isfunction 
promos = [func for name, func in getmembers(promotions, isfunction) if name.endswith('_promo')  and name != 'best_promo']

重构总结

维度经典模式函数重构
代码量较多显著减少
可维护性需管理类继承关系函数即策略,直观清晰
扩展性新策略需新增类新函数自动纳入

适用场景:当策略无状态且仅需单次计算时,函数重构能大幅提升开发效率。若需维护策略状态,则仍需使用类实现。


通过这一重构实践,我们不仅减少了代码冗余,还充分利用了Python的函数特性,展现了设计模式与语言特性的结合之美。

http://www.xdnf.cn/news/206281.html

相关文章:

  • Python在自动驾驶仿真环境中的应用:构建智能驾驶的虚拟世界
  • Java Properties 类详解
  • 「Mac畅玩AIGC与多模态07」开发篇03 - 开发第一个 Agent 插件调用应用
  • 嵌入式设备异常掉电怎么办?
  • 如何查看k8s获取系统是否清理过docker镜像
  • CISC与RISC详解:定义、区别及典型处理器
  • DDoS vs CC攻击:哪种对服务器威胁更大?
  • 最新字节跳动运维云原生面经分享
  • 【工具】PDF转HTML
  • 2025 TK ads短视频广告投放策略多维度解析
  • 针对Linux挂载NAS供Minio使用及数据恢复的需求
  • git配置SSH KEY
  • 业务层在事务中高频创建动态表然后删除或者回滚导致 pg_dump 概率出现备份失败问题分析
  • Neo4j 的 `SET n += $properties` 语法详解
  • Prometheus监控
  • 1.4 点云数据获取方式——结构光相机
  • 面向网络安全的开源 大模型-Foundation-Sec-8B
  • fastapi和flaskapi有什么区别
  • QWidget无边框设置
  • Spring MVC 如何映射 HTTP 请求到 Controller 方法?
  • 数据库系统概论(六)详细讲解关系代数(利用简单到难的层次带你一步一步掌握)
  • docker desktop汉化
  • 价值投资笔记:企业护城河——虚假陷阱与隐性壁垒的深度解析
  • Git 操作命令
  • JavaScript性能优化实战
  • [Android]导航栏中插入电源菜单
  • Go 语言中的 `os.Truncate` 函数详解
  • 2025年4月最新Cursor续杯详细步骤
  • 分治而不割裂—分治协同式敏捷工作模式
  • 若依后台管理系统-v3.8.8-登录模块--个人笔记