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

它在:

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

中非常核心。

相关推荐
yugi9878383 小时前
C# 串口下载烧写BIN文件工具
开发语言·c#
Agent产品评测局3 小时前
互联网行业自动化平台选型,运营全流程提效指南:2026企业级智能体架构与实战全解析
运维·人工智能·ai·chatgpt·架构·自动化
The_Ticker3 小时前
印度股票实时行情API(低成本方案)
python·websocket·算法·金融·区块链
ZC跨境爬虫4 小时前
Scrapy工作空间搭建与目录结构解析:从初始化到基础配置全流程
前端·爬虫·python·scrapy·自动化
开心码农1号4 小时前
Java rabbitMQ如何发送、消费消息、全套可靠方案
java·rabbitmq·java-rabbitmq
EAIReport4 小时前
国外网站数据批量采集技术实现路径
开发语言·python
超绝振刀怪4 小时前
【C++可变模板参数】
开发语言·c++·可变模板参数
Ulyanov4 小时前
基于ttk的现代化Python音视频播放器:UI设计与可视化技术深度解析
python·ui·音视频
蜡台4 小时前
JetBrains IDEA 安装 卸载相关总结
java·ide·intellij-idea·注册码
WJLSH1234 小时前
TomCat
java·tomcat