在开发中,你一定写过这样的代码:
python
if pay_type == "wechat":
...
elif pay_type == "alipay":
...
elif pay_type == "bank":
...
刚开始还好,但随着业务发展:
- 分支越来越多
- 逻辑越来越复杂
- 修改一个分支可能影响其他逻辑
这时候代码就会变得:
难维护、难扩展、容易出错
这正是 策略模式(Strategy) 要解决的问题。
一、策略模式解决什么问题?
一句话:
定义一系列算法(策略),将它们封装起来,并且可以互相替换。
关键词:
- 算法封装
- 动态切换
- 避免 if/else
- 解耦逻辑
二、一个典型场景:支付方式
假设我们有一个支付函数:
python
def pay(amount, pay_type):
if pay_type == "wechat":
print("微信支付")
elif pay_type == "alipay":
print("支付宝支付")
elif pay_type == "bank":
print("银行卡支付")
问题:
- 每新增一种支付方式,都要改代码
- 违反开闭原则
- 逻辑越来越臃肿
三、策略模式的核心思想
把每一种"算法"拆出来,变成独立类。
结构:
Context ---> Strategy
|
-------------------
| | |
StrategyA StrategyB StrategyC
核心:
- 每个策略负责一种行为
- Context 负责使用策略
四、Python 实现策略模式
1️⃣ 定义策略接口
python
from abc import ABC, abstractmethod
class PaymentStrategy(ABC):
@abstractmethod
def pay(self, amount):
pass
2️⃣ 实现具体策略
python
class WeChatPay(PaymentStrategy):
def pay(self, amount):
print(f"微信支付 {amount}")
class AliPay(PaymentStrategy):
def pay(self, amount):
print(f"支付宝支付 {amount}")
class BankPay(PaymentStrategy):
def pay(self, amount):
print(f"银行卡支付 {amount}")
3️⃣ 定义上下文(Context)
python
class PaymentContext:
def __init__(self, strategy: PaymentStrategy):
self.strategy = strategy
def execute(self, amount):
self.strategy.pay(amount)
4️⃣ 使用方式
python
context = PaymentContext(WeChatPay())
context.execute(100)
context = PaymentContext(AliPay())
context.execute(200)
现在:
- 不需要 if/else
- 想换策略,直接换对象
五、策略模式的核心价值
策略模式本质是:
把"变化的算法"抽离出来。
它解决的是:
- 条件分支过多
- 算法频繁变化
- 逻辑难以扩展
六、Python 中更简洁的写法(函数版策略)
Python 不一定非要写类。
可以直接用函数:
python
def wechat_pay(amount):
print("微信支付")
def alipay(amount):
print("支付宝支付")
Context:
python
class PaymentContext:
def __init__(self, strategy):
self.strategy = strategy
def execute(self, amount):
self.strategy(amount)
使用:
python
context = PaymentContext(wechat_pay)
context.execute(100)
更 Pythonic。
七、策略模式 vs if/else
很多人会问:
if/else 不也能实现吗?
区别在于:
| 对比点 | if/else | 策略模式 |
|---|---|---|
| 扩展性 | 差 | 强 |
| 可维护性 | 差 | 高 |
| 是否符合开闭原则 | 否 | 是 |
| 代码结构 | 集中 | 分散 |
一句话:
if/else 是"写死逻辑",策略模式是"可插拔逻辑"。
八、策略模式 vs 桥接模式
两者结构很像,但本质不同:
| 对比点 | 策略模式 | 桥接模式 |
|---|---|---|
| 目的 | 替换算法 | 解耦维度 |
| 是否有多维结构 | 否 | 是 |
| 是否强调变化 | 算法变化 | 维度变化 |
一句话:
策略是"换方法",
桥接是"拆结构"。
九、真实项目中的应用
策略模式非常常见:
1️⃣ 支付系统
不同支付方式:
- 微信
- 支付宝
- 银行
2️⃣ 折扣计算
python
if user_type == "vip":
...
elif user_type == "new":
...
可以改为策略。
3️⃣ 排序算法选择
python
sort_strategy = QuickSort()
4️⃣ 风控策略
不同风控规则:
- 黑名单
- 频率限制
- 地域限制
十、什么时候使用策略模式?
适合:
- 多种算法可替换
- if/else 很多
- 逻辑变化频繁
不适合:
- 逻辑非常简单
- 只有两三种情况且稳定
十一、常见误区
1️⃣ 过度设计
只有两个分支也用策略 → 过度复杂。
2️⃣ 策略类爆炸
如果策略太多,类数量会增加。
可以用:
- 字典注册
- 配置驱动
十二、一句话总结
策略模式的本质是:把可变逻辑抽出来,变成可替换的策略。
用一句更直白的话:
不要写一堆 if/else,把它们变成对象(或函数)。
接下来行为型模式可以继续讲:
👉 观察者模式(Observer)
它在:
- 事件系统
- 消息通知
- 前端响应式
中非常核心。