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

它在:

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

中非常核心。

相关推荐
召田最帅boy1 小时前
SpringBoot实现AI智能评论审核与自动回复
人工智能·spring boot·后端·架构
麦麦鸡腿堡1 小时前
JavaWeb_SpringBootWeb,HTTP协议,Tomcat快速入门
java·开发语言
码云数智-园园1 小时前
前端跨域全解析:核心原理、解决方案选型与实战指南
开发语言
qq_417695051 小时前
内存对齐与缓存友好设计
开发语言·c++·算法
2301_816651221 小时前
实时系统下的C++编程
开发语言·c++·算法
一然明月1 小时前
Qt QML 锚定(Anchors)全解析
java·数据库·qt
晓纪同学1 小时前
EffctiveC++_02第二章
java·jvm·c++
2401_831824961 小时前
C++与Python混合编程实战
开发语言·c++·算法