策略模式(面试Markdown)
概念
策略模式属于行为型设计模式 。
把不同的算法/业务逻辑 抽成独立的策略类,实现同一个公共接口;上下文类持有策略对象,业务逻辑可以动态切换,把算法和使用算法的业务代码解耦。
简单说:同一套行为有多种不同实现,运行时动态选择用哪一种 ,避免大量 if‑else / switch。
核心角色
- Strategy(策略接口):定义所有策略统一的方法规范
- ConcreteStrategy(具体策略):不同的业务实现,每个类对应一套算法
- 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);
}
}
适用业务场景
- 同一业务,多种分支算法
比如:多种支付方式、多种折扣计算(满减、折扣、优惠券)、多种文件导出(Excel/PDF/Word)。
如果不用策略模式,代码会写一堆 if‑else 判断支付类型,分支越来越多代码臃肿。
-
需要运行时动态切换算法
根据前端参数、配置、用户类型,程序跑起来的时候才决定用哪一套逻辑。
-
需要隔离不同业务逻辑,便于扩展
新增一种策略,只需要新增一个实现类,不用修改原有业务代码,符合开闭原则。
优缺点
✅ 优点
- 消除大量if‑else、switch
- 算法独立,方便单元测试
- 扩展新策略只新增类,不改旧代码,遵守开闭原则
- 运行时动态切换策略
❌ 缺点
- 策略变多,会产生大量小策略类,类数量膨胀
- 客户端需要理解各个策略的区别,才知道该选哪个策略
面试口语小结
策略模式就是把多种可替换的业务算法抽出来实现同一个接口,上下文持有策略对象,运行时动态替换。主要用来消灭复杂if‑else,新增业务逻辑不用改老代码。像支付、折扣计算这些多分支场景非常适合。