策略模式简介

策略模式是一种行为型设计模式,核心思想是把一系列算法封装成独立的类,让它们可以互相替换。调用方只依赖抽象接口,压根不用关心具体用哪个算法。代码里满屏的 if-else、switch-case来选算法?用策略模式一拆,每个分支变成一个策略类,调用方想用哪个就注入哪个,干干净净。策略模式有3个角色:

  1. Strategy策略接口,定义算法的抽象方法

  2. ConcreteStrategy 具体策略,实现不同的算法逻辑

3)Context上下文,持有策略接口引用,把实际工作委托给策略对象

java 复制代码
// 策略接口
interface PayStrategy {
    void pay(int amount);
}

// 具体策略:微信支付
class WeChatPay implements PayStrategy {
    @Override
    public void pay(int amount) {
        System.out.println("微信支付 " + amount + " 元");
    }
}

// 具体策略:支付宝
class AliPay implements PayStrategy {
    @Override
    public void pay(int amount) {
        System.out.println("支付宝支付 " + amount + " 元");
    }
}

// 上下文
class PayContext {
    private PayStrategy strategy;

    public void setStrategy(PayStrategy strategy) {
        this.strategy = strategy;
    }

    public void executePayment(int amount) {
        strategy.pay(amount);
    }
}

// 使用
PayContext context = new PayContext();
context.setStrategy(new WeChatPay());
context.executePayment(100);  // 微信支付 100 元

context.setStrategy(new AliPay());
context.executePayment(200);  // 支付宝支付 200 元

加一种新支付方式?新建一个策略类就行,Context代码一行不用动。常见使用场景:

1)支付系统,微信、支付宝、银联、Apple Pay,每种支付方式一个策略

2)促销活动,满减、打折、满赠、秒杀,不同促销规则用不同策略计算价格

3)数据导出,导出Excel、CSV、PDF,格式不同但接口统一

4)日志框架,输出到控制台、文件、远程服务器,Logback的Appender 就是策略模式

扩展知识

策略模式解决什么问题

假设没有策略模式,促销价格计算可能长这样:

java 复制代码
public double calculate(String type, double price) {
    if ("满减".equals(type)) {
        return price >= 100 ? price - 20 : price;
    } else if ("折扣".equals(type)) {
        return price * 0.8;
    } else if ("秒杀".equals(type)) {
        return 9.9;
    }
    // 每加一种促销,这里就多一个分支
    return price;
}

问题很明显:促销类型越多,这个方法越臃肿。改一种促销逻辑,整个方法都有风险。测试也麻烦,想单独测某种促销逻辑,得把整个方法跑一遍。

策略模式把每种促销拆成独立的类,各自演化互不影响,单元测试也能单独跑。

策略的选择谁来负责

策略模式把算法封装好了,但具体用哪个策略还得有人决定。常见做法有3种:

实际项目里工厂模式配合策略模式最常见,搞一个Map 把策略类型和策略对象映射起来:

java 复制代码
@Component
public class PayStrategyFactory {
    @Autowired
    private Map<String, PayStrategy> strategyMap;

    public PayStrategy getStrategy(String type) {
        return strategyMap.get(type);
    }
}

Spring会自动把所有PayStrategy实现类注入到这个Map里,key是Bean名称。

相关推荐
geovindu11 天前
java: Strategy Pattern
java·开发语言·后端·设计模式·策略模式·行为模式
geovindu12 天前
CSharp: Strategy Pattern
开发语言·后端·c#·.net·.netcore·策略模式·行为模式
沪上企服通14 天前
代账数据的可移植性设计:开放接口、账套导出与 exit strategy 工程笔记(上海 5 家样本对照)
笔记·策略模式
码匠许师傅14 天前
【设计模式精讲】26.策略模式(Strategy)
c++·设计模式·策略模式·uml
++==17 天前
基于策略模式的应用层协议支持
策略模式
Java后端的Ai之路17 天前
23、Python - 策略模式
linux·python·策略模式
程序员夏洛19 天前
什么是策略模式?一般用在什么场景?
策略模式
user_admin_god20 天前
数据采集/交换系统设计经验
spring boot·spring·策略模式
Nontee1 个月前
Quartz 集群 + 策略模式:逾期预警推送系统设计实录
linux·服务器·策略模式
二炮手亮子1 个月前
从 BIO、NIO、AIO 到多路复用与 Netty
策略模式·nio