Skip to content

策略模式

策略模式是软件工程中非常经典且实用的一种行为型设计模式(Behavioral Design Pattern)。它旨在让你在运行时“动态地切换算法或行为”,而无需修改使用这些算法的代码。

核心组成

角色说明
1. 策略接口(Strategy Interface)定义所有具体策略必须实现的公共方法。它是抽象的,代表一种行为契约。
2. 具体策略类(Concrete Strategy)实现策略接口的具体类。每个类封装了一种具体的算法或行为。
3. 上下文(Context)持有一个策略接口的引用。它不关心具体使用哪个策略,只负责调用策略的方法。客户端通过上下文来使用策略。

核心思想

  • 定义一个“策略接口”,表示一类行为(如 PaymentStrategy)。
  • 每种具体行为(如微信支付、支付宝支付)都实现这个接口。
  • 上下文(Context)类持有一个策略接口的引用,在运行时决定使用哪种策略。

使用场景

  • 一个系统需要在多种算法中动态选择一种。
  • 一个类中有多个 if-elseswitch-case 条件语句,且每个分支代表一种行为。
  • 需要屏蔽算法的实现细节,让算法变化独立于使用它的客户端。
  • 不希望客户端知道具体算法,只关心结果。

示例:

java
public interface BasePay {

    String getPayType();

    void pay(BigDecimal amount);
}
java
@Slf4j
public class AliPay implements BasePay{
    @Override
    public String getPayType() {
        return "支付宝支付";
    }

    @Override
    public void pay(BigDecimal amount) {
        log.info("使用支付宝支付,支付金额:{}", amount);
    }
}

@Slf4j
public class WxPay implements BasePay {

    @Override
    public String getPayType() {
        return "微信支付";
    }

    @Override
    public void pay(BigDecimal amount) {
        log.info("使用微信支付,支付金额:{}", amount);
    }
}
@Slf4j
public class YinLianPay implements BasePay {
    @Override
    public String getPayType() {
        return "银联支付";
    }

    @Override
    public void pay(java.math.BigDecimal amount) {
        log.info("使用银联支付,支付金额:{}", amount);
    }
}
java
public class Main {

    public static void main(String[] args) {
        BasePay basePay = new AliPay();
        basePay.pay(new java.math.BigDecimal("100"));
    }
}

与简单工厂联动

java
public class PayFactory {


    public static BasePay getPay(String payType) {
        // 如果是在spring中可以通过构造方法自动注入实现类,根据策略模式中的`getPayType()`来判断需要调用什么类型的支付方式
        switch (payType) {
            case "支付宝":
                return new AliPay();
            case "微信":
                return new WxPay();
            case "银联":
                return new YinLianPay();
            default:
                throw new IllegalArgumentException("不支持的支付类型: " + payType);
        }
    }
}
java
public class Main {

    public static void main(String[] args) {
        BasePay basePay = new AliPay();
        basePay.pay(new java.math.BigDecimal("100"));

        PayFactory.getPay("微信").pay(new java.math.BigDecimal("200"));
    }
}
最近更新