什么是策略模式?一般用在什么场景?

策略模式(面试Markdown)

概念

策略模式属于行为型设计模式

不同的算法/业务逻辑 抽成独立的策略类,实现同一个公共接口;上下文类持有策略对象,业务逻辑可以动态切换,把算法和使用算法的业务代码解耦

简单说:同一套行为有多种不同实现,运行时动态选择用哪一种 ,避免大量 if‑else / switch

核心角色

  1. Strategy(策略接口):定义所有策略统一的方法规范
  2. ConcreteStrategy(具体策略):不同的业务实现,每个类对应一套算法
  3. Context(上下文):持有策略对象,对外提供调用入口,负责和策略交互

代码极简示例

java 复制代码
// 策略接口
public interface PayStrategy {
    void pay(long money);
}

// 具体策略:微信支付
class WechatPay implements PayStrategy{
    @Override
    public void pay(long money) {
        System.out.println("微信支付:"+money);
    }
}
// 具体策略:支付宝支付
class AliPay implements PayStrategy{
    @Override
    public void pay(long money) {
        System.out.println("支付宝支付:"+money);
    }
}

// 上下文
public class PayContext{
    private PayStrategy strategy;
    public PayContext(PayStrategy strategy){
        this.strategy = strategy;
    }
    public void executePay(long money){
        strategy.pay(money);
    }
}

// 使用
public class Test{
    public static void main(String[] args) {
        PayContext context = new PayContext(new AliPay());
        context.executePay(100);
    }
}

适用业务场景

  1. 同一业务,多种分支算法
    比如:多种支付方式、多种折扣计算(满减、折扣、优惠券)、多种文件导出(Excel/PDF/Word)。

如果不用策略模式,代码会写一堆 if‑else 判断支付类型,分支越来越多代码臃肿。

  1. 需要运行时动态切换算法

    根据前端参数、配置、用户类型,程序跑起来的时候才决定用哪一套逻辑。

  2. 需要隔离不同业务逻辑,便于扩展

    新增一种策略,只需要新增一个实现类,不用修改原有业务代码,符合开闭原则

优缺点

✅ 优点

  • 消除大量if‑else、switch
  • 算法独立,方便单元测试
  • 扩展新策略只新增类,不改旧代码,遵守开闭原则
  • 运行时动态切换策略

❌ 缺点

  • 策略变多,会产生大量小策略类,类数量膨胀
  • 客户端需要理解各个策略的区别,才知道该选哪个策略

面试口语小结

策略模式就是把多种可替换的业务算法抽出来实现同一个接口,上下文持有策略对象,运行时动态替换。主要用来消灭复杂if‑else,新增业务逻辑不用改老代码。像支付、折扣计算这些多分支场景非常适合。

相关推荐
user_admin_god17 小时前
数据采集/交换系统设计经验
spring boot·spring·策略模式
Nontee8 天前
Quartz 集群 + 策略模式:逾期预警推送系统设计实录
linux·服务器·策略模式
二炮手亮子9 天前
从 BIO、NIO、AIO 到多路复用与 Netty
策略模式·nio
cui_hao_nan10 天前
大模型负责“聪明“,策略模式负责“执行“:智能配图系统如何自动选择图片来源
策略模式·ai开发
阿萨德528号13 天前
npm 包发布实战指南:从零发布、更新迭代到版本治理
前端·npm·策略模式
AI人工智能+电脑小能手14 天前
大白话说Java设计模式-26-策略模式(业务实战篇)
java·spring·设计模式·策略模式·支付系统·算法切换
coding4u14 天前
Mac 多桌面(Spaces)的正确用法:你的屏幕可以大三倍
macos·docker·计算机外设·文件管理·策略模式
AI人工智能+电脑小能手14 天前
大白话说Java设计模式-27-策略模式(源码剖析篇)
java·spring·设计模式·策略模式·源码分析·事务管理·comparator
小此方14 天前
Linux加餐(一):藏在Linux中的设计模式(一)策略模式与日志
linux·设计模式·策略模式