设计模式实战:策略模式(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)

它在:

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

中非常核心。

相关推荐
闲猫5 小时前
Spring AI 对接Deepseek ChatModel 聊天对话
java·前端·spring
哥不想学算法5 小时前
【C++】字符串字面量拼接
开发语言·c++
木木学AI6 小时前
AI客服系统技术选型:Agentic架构与传统规则引擎的能力差异评估
人工智能·架构
hhzz6 小时前
Python大数据实战(十六):音乐推荐系统——基于协同过滤算法构建个性化歌单引擎
大数据·人工智能·python·数据挖掘·数据分析
SunnyDays10117 小时前
Python PDF 转 Markdown 详解(转换整个文档,特定页面,表格,扫描 PDF)
python·pdf 转 markdown·pdf 转 md·扫描 pdf 转 md·pdf 表格转 md
gugucoding7 小时前
21. 【C语言】打包不同类型:结构体
c语言·开发语言
自信的未来7 小时前
JSON 工具|Web Worker 工程化打包 + 语法自动修复 + 多语言代码生成实战
java·前端·json
2601_954706497 小时前
云手机 API 自动化实战:Python 批量控机、挂机脚本完整实现
python·智能手机·自动化
Brookty7 小时前
【JavaEE】线程安全(一).4:写块串行保安全、CAS
java·开发语言·java-ee·多线程·线程安全