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

它在:

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

中非常核心。

相关推荐
程序员龙叔9 小时前
编写高质量 Skill 系列 -- 如何设计需求分析与用例生成的 SKILL
自动化测试·软件测试·python·软件测试工程师·接口测试·性能测试·skill·ai测试
NE_STOP12 小时前
Vide Coding--AI编程工具的选择
java
用户83562907805112 小时前
使用 Python 操作 Word 内容控件
后端·python
LDR00612 小时前
Type-C 快充全面升级!LDR6601 赋能个人护理便携电机,重塑剃须刀 / 理发器新体验
c语言·开发语言
雪碧聊技术12 小时前
Tree.js是什么?一文讲透
开发语言·javascript·ecmascript
码云数智-园园12 小时前
C++20 Modules 模块详解
java·开发语言·spring
程序员黑豆13 小时前
JDK 下载安装与配置详细教程
java·前端·ai编程
东方佑13 小时前
FRSM 规模效应与架构对比补充报告
架构
小宇宙Zz13 小时前
Maven依赖冲突
java·服务器·maven
swordbob13 小时前
NIO的channel中什么是 fd(File Descriptor,文件描述符)
java·开发语言·nio