策略模式简介

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

相关推荐
智慧城市203018 小时前
关键供应商连续交付不合格批次,说明质量风险可能持续存在。企业需要建立“批次隔离、加严检验、驻厂遏制、复检放行、供应商升级”的处置闭环,同时统筹保供。
数据分析·策略模式·战略咨询·流程管理
happy_baymax2 天前
Dell G3 3590 黑苹果实战:OpenCore 1.0.8 + NullMoth 驱动让 GTX 1660 跑起 Metal
策略模式
遇码2 天前
macOS 触摸板捏合在 GPUI 里无响应:vendor 打补丁,把手势合成为 cmd+滚轮事件
rust·图形渲染·策略模式·桌面应用·gpui
mmsx3 天前
Android 架构分层:MVVM 与 MVP 共存,网络层怎么切
android·策略模式·mvvm·mvp
博风3 天前
7、设计模式应用举例:策略模式:加密、解密文件
设计模式·策略模式
mmsx3 天前
Android 本地优先的三级语义理解降级链
android·数码相机·策略模式
早点睡觉好了3 天前
LangChain 源码入门 02:消息、ChatPromptTemplate 与 Chat Model 调用链
ai·langchain·策略模式
花间相见4 天前
【计算基础|网络12】TCP 抓包与经典边界问题
网络·tcp/ip·策略模式
花间相见4 天前
【计算基础|网络11】TCP(下):拥塞控制与参数优化
网络·tcp/ip·策略模式
小羊没烦恼!5 天前
OS X 上使用.NET开发应用程序
开发语言·前端·数据库·人工智能·c#·策略模式