策略模式
策略模式是软件工程中非常经典且实用的一种行为型设计模式(Behavioral Design Pattern)。它旨在让你在运行时“动态地切换算法或行为”,而无需修改使用这些算法的代码。
核心组成
角色 | 说明 |
---|---|
1. 策略接口(Strategy Interface) | 定义所有具体策略必须实现的公共方法。它是抽象的,代表一种行为契约。 |
2. 具体策略类(Concrete Strategy) | 实现策略接口的具体类。每个类封装了一种具体的算法或行为。 |
3. 上下文(Context) | 持有一个策略接口的引用。它不关心具体使用哪个策略,只负责调用策略的方法。客户端通过上下文来使用策略。 |
核心思想
- 定义一个“策略接口”,表示一类行为(如
PaymentStrategy
)。 - 每种具体行为(如微信支付、支付宝支付)都实现这个接口。
- 上下文(Context)类持有一个策略接口的引用,在运行时决定使用哪种策略。
使用场景
- 一个系统需要在多种算法中动态选择一种。
- 一个类中有多个
if-else
或switch-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"));
}
}