小易说IT 小易说IT

Java 策略模式(Strategy) 示例代码

策略模式:定义一系列算法,把每一个算法封装起来,并且使它们可互相替换。让算法的变化独立于使用算法的客户端。 核心角色:

  1. Strategy(策略接口):统一算法行为接口

  2. ConcreteStrategy(具体策略):实现不同算法

  3. Context(环境上下文):持有策略对象,对外提供调用,委托策略执行逻辑

完整示例:支付方式策略

场景:订单支付,可以切换支付宝、微信、银行卡支付。

// 1. 策略接口:支付策略
public interface PaymentStrategy {
    /**
     * 支付
     * @param amount 支付金额
     */
    void pay(double amount);
}

// 2. 具体策略:支付宝支付
public class AliPayStrategy implements PaymentStrategy{
    @Override
    public void pay(double amount) {
        System.out.println("使用【支付宝】支付,金额:" + amount + " 元");
    }
}

// 具体策略:微信支付
public class WechatPayStrategy implements PaymentStrategy{
    @Override
    public void pay(double amount) {
        System.out.println("使用【微信】支付,金额:" + amount + " 元");
    }
}

// 具体策略:银行卡支付
public class BankCardPayStrategy implements PaymentStrategy{
    @Override
    public void pay(double amount) {
        System.out.println("使用【银行卡】支付,金额:" + amount + " 元");
    }
}

// 3. Context 上下文:订单,持有策略
public class OrderContext {
    private PaymentStrategy paymentStrategy;

    // 构造注入策略
    public OrderContext(PaymentStrategy paymentStrategy) {
        this.paymentStrategy = paymentStrategy;
    }

    // 支持运行时动态切换策略
    public void setPaymentStrategy(PaymentStrategy paymentStrategy) {
        this.paymentStrategy = paymentStrategy;
    }

    // 委托策略执行支付
    public void doPay(double amount){
        paymentStrategy.pay(amount);
    }
}

// 客户端测试
public class StrategyDemo {
    public static void main(String[] args) {
        double money = 299.0;

        // 选择支付宝策略
        OrderContext order = new OrderContext(new AliPayStrategy());
        order.doPay(money);

        // 运行时切换为微信支付
        order.setPaymentStrategy(new WechatPayStrategy());
        order.doPay(money);

        // 切换银行卡
        order.setPaymentStrategy(new BankCardPayStrategy());
        order.doPay(money);

        // JDK8 lambda简化:不需要新建类,直接匿名实现策略接口
        order.setPaymentStrategy(amount -> System.out.println("【现金】支付,金额:" + amount + "元"));
        order.doPay(money);
    }
}

输出结果

使用【支付宝】支付,金额:299.0 元
使用【微信】支付,金额:299.0 元
使用【银行卡】支付,金额:299.0 元
【现金】支付,金额:299.0元

策略模式要点

优点

  1. 算法独立封装,新增算法只需要新增实现类,符合开闭原则,不用修改原有代码

  2. 运行时动态替换算法

  3. 消除大量 if‑else / switch 判断

缺点

  1. 策略变多,类数量会膨胀

  2. 客户端需要理解各个策略的区别,才能选择合适策略

消除 if‑else 改造示例(业务常用写法)

很多业务会配合简单工厂,根据类型获取策略,避免客户端直接 new 各个实现类

import java.util.HashMap;
import java.util.Map;

public class PaymentStrategyFactory {
    private static final Map<String,PaymentStrategy> STRATEGY_MAP = new HashMap<>();

    static {
        STRATEGY_MAP.put("ALI",new AliPayStrategy());
        STRATEGY_MAP.put("WECHAT",new WechatPayStrategy());
        STRATEGY_MAP.put("BANK",new BankCardPayStrategy());
    }

    public static PaymentStrategy getStrategy(String payType){
        return STRATEGY_MAP.get(payType);
    }

    public static void main(String[] args) {
        String payType = "WECHAT";
        PaymentStrategy strategy = getStrategy(payType);
        OrderContext context = new OrderContext(strategy);
        context.doPay(520);
    }
}

JDK 中的策略模式典型应用

  1. java.util.Comparator 接口,Collections.sort(List, Comparator)

Comparator 就是 Strategy,不同比较器就是不同具体策略,可以动态替换排序算法。

// Comparator 策略示例
List<String> list = Arrays.asList("a","cc","bbb");
// 策略1:按字符串长度排序
Collections.sort(list, Comparator.comparingInt(String::length));
// 策略2:自然字典序
Collections.sort(list, String::compareTo);

本文原创作者:易君召,详见:https://www.yijunzhao.cc/about,转载请注明出处。

原文链接 https://www.yijunzhao.cc/archives/java-strategy-pattern-example-code

欢迎访问 https://www.yijunzhao.cc/

https://www.yijunzhao.cc/