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

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

经典策略模式实现

  • 核心概念
    上下文(Context):订单(Order)类,负责计算总价和应用折扣。
  • 策略接口(Strategy):
    抽象类Promotion,定义discount方法。
  • 具体策略(Concrete Strategies):
    三个子类分别实现不同折扣规则。
python 复制代码
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的一等函数特性简化代码:
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()  * .1
    return discount 

优势对比

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

动态选择最佳策略

简单实现

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

python 复制代码
promos = [fidelity_promo, bulk_item_promo, large_order_promo]
def best_promo(order):
    return max(promo(order) for promo in promos)

动态收集策略

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

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

重构总结

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

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


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

相关推荐
成成成成成成果1 小时前
揭秘动态测试:软件质量的实战防线
python·功能测试·测试工具·测试用例·可用性测试
天天进步20152 小时前
Python游戏开发引擎设计与实现
开发语言·python·pygame
数据狐(DataFox)3 小时前
CTE公用表表达式的可读性与性能优化
经验分享·python·sql
蹦蹦跳跳真可爱5893 小时前
Python----MCP(MCP 简介、uv工具、创建MCP流程、MCP客户端接入Qwen、MCP客户端接入vLLM)
开发语言·人工智能·python·语言模型
No0d1es3 小时前
第13届蓝桥杯Python青少组中/高级组选拔赛(STEMA)2022年1月22日真题
python·青少年编程·蓝桥杯·选拔赛
MediaTea3 小时前
Python 库手册:getopt Unix 风格参数解析模块
服务器·开发语言·python·unix
LoveC5213 小时前
设计模式之适配器模式
设计模式·适配器模式
王尼莫啊3 小时前
【立体标定】圆形标定板标定python实现
开发语言·python·opencv
cosX+sinY4 小时前
10 卷积神经网络
python·深度学习·cnn
非极限码农4 小时前
基于Deepseek的语言润色助手API实现与部署指南
python·微服务·自然语言处理