策略模式(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(),
}
# 加新折扣 = 写新类 + 字典加一行
核心三句话
- 策略模式 = if-else 里的算法,拆成独立类
- 加新功能不用改旧代码(开闭原则)
- 组合优于继承 — 运行时可以换策略
模板方法模式对比
| 策略模式 | 模板方法模式 |
|---|---|
| 换整个算法 | 调某个步骤 |
| 运行时选 | 继承固定 |
适合场景
- 多个 if-else 判断"做什么"
- 算法经常要加新的
- 不同算法需要独立测试
代码文件
Day01.code/strategy_pattern_demo.py