设计模式实战:策略模式(Strategy)

在开发中,你一定写过这样的代码:

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)

它在:

  • 事件系统
  • 消息通知
  • 前端响应式

中非常核心。

相关推荐
伍一5114 分钟前
hiprint-spring-boot打印组件介绍
java·hiprint
神仙别闹5 小时前
基于 C++ 实现(控制台)学生成绩管理系统
开发语言·c++
Y幽谷客5 小时前
Python加载本地大模型(Qwen3.5 8B)
python·大模型
Wang's Blog5 小时前
Java 接入Redis: 服务启动停止与后台运行配置
java·服务器·redis
此时不提桶,更待何时6 小时前
01-04-B-垃圾回收面试与生产事故实战
java·jvm·面试
伞伞悦读6 小时前
【第36期】Python 目录与路径详解:pathlib、文件遍历、创建、复制、移动和删除风险
开发语言·python
线上放牧人6 小时前
Windows删除图标缓存
windows·python·pyqt
GreenTea6 小时前
GrokBot 核心成员 Lauren Tan:每月交付 2000 个 PR 的人,是怎么用 AI 的
前端·后端·架构
Hrain-AI6 小时前
多 Agent 并行不打架:worktree 隔离与反馈回流落地(附脚本)
网络·数据库·人工智能·架构
qq_5470261797 小时前
Python 变量和简单数据类型
python