策略模式简介

策略模式是一种行为型设计模式,核心思想是把一系列算法封装成独立的类,让它们可以互相替换。调用方只依赖抽象接口,压根不用关心具体用哪个算法。代码里满屏的 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名称。

相关推荐
johnny23312 小时前
终端文件管理器:Yazi、nnn、Superfile、lf、Ranger、walk
策略模式
AI砖家12 小时前
DeepSeek TUI 保姆级安装配置全指南 -Windows||macOS双平台全覆盖
服务器·前端·人工智能·windows·macos·ai编程·策略模式
有梦想的小何13 小时前
Cursor AI 编程实战(篇三):Domain、Infrastructure 与策略模式
java·ai编程·策略模式
多加点辣也没关系1 天前
设计模式-策略模式
java·设计模式·策略模式
悟05152 天前
设计模式-策略模式
设计模式·策略模式
skilllite作者2 天前
UI-TARS-Desktop 智能桌面自动化实战指南
ui·自动化·策略模式
Java知识技术分享2 天前
策略模式的两种实现:抽象类和接口
java·spring·策略模式
丷丩6 天前
策略模式实战:GeoAI-UP中MVT发布器的可扩展架构设计
人工智能·架构·gis·策略模式·空间分析·geoai
码界奇点7 天前
基于策略模式的多数据源爬虫系统设计与实现
爬虫·python·毕业设计·策略模式·源代码管理·数据库系统
05候补工程师8 天前
【Python实战】告别杂乱脚本!基于SOLID原则与策略模式的 PDF转Word 批量处理系统
python·设计模式·pdf·word·策略模式