跳到正文
Joeplover
学习笔记·2026-06-19·约 2 分钟阅读

策略模式(Strategy Pattern)详解

把 if-else 里藏的"不同做法"拆成独立类,用查找表替换条件分支。含完整代码示例。

策略模式

DAY01c — 策略模式(Strategy Pattern)

相关笔记:[[DAY01-成长计划启动]] | [[DAY01b-Python迷惑语法]] | [[DAY01d-HTTP拦截与CookieSession]] 相关模式:[[DAY02-观察者模式]] | [[设计模式]] 相关主题:[[Python基础]]

一句话

把 if-else 里藏的"不同做法",拆成独立类,调用方选一个来用。

为什么需要

# V1:一个函数里堆满 if-else
def calculate_discount(order):
    if order.level == "vip": return total * 0.9
    elif order.level == "svip": return total * 0.8
    elif order.coupon == "SAVE100": return total - 100
    # ... 越来越多

问题: 加新折扣 → 改这个函数 → 可能改崩别的

策略模式解法

class DiscountStrategy(ABC):
    @abstractmethod
    def calculate(self, order): ...

class VipDiscount(DiscountStrategy):
    def calculate(self, order):
        return order.total * 0.9

# 查找表
DISCOUNT_MAP = {
    "vip": VipDiscount(),
    "svip": SvipDiscount(),
}
# 加新折扣 = 写新类 + 字典加一行

核心三句话

  1. 策略模式 = if-else 里的算法,拆成独立类
  2. 加新功能不用改旧代码(开闭原则)
  3. 组合优于继承 — 运行时可以换策略

模板方法模式对比

策略模式模板方法模式
换整个算法调某个步骤
运行时选继承固定

适合场景

  • 多个 if-else 判断"做什么"
  • 算法经常要加新的
  • 不同算法需要独立测试

代码文件

  • Day01.code/strategy_pattern_demo.py