Java策略模式 & Spring结合策略模式

本文最后更新于:2022年7月12日 下午

概览:策略模式

策略模式

策略模式: 定义一系列的算法, 把它们一个个封装起来, 并且使它们可相互替换。 本模式使得算法可独立于使用它的客户而变化。

参考链接:https://www.jianshu.com/p/3ea48ecd7178

案例:支付方式,例如一个支付可以使用支付宝支付、也可以使用微信支付

最直接的做法:if else,但是一旦业务复杂了,这样的代码就很难维护。

定义接口

1
2
3
4
5
6
interface Payment{
// 获取支付类型
PayType getPayType();
// 支付,获取支付结果
PayState pay(PayContext, int amount);
}

支付类型

1
2
3
4
enum PayType{
ALI_PAY,
WECHAT_PAY;
}

支付宝支付

1
2
3
4
5
6
7
8
9
10
public class AliPay implement Payment{
public PayType getPayType(){
return PayType.ALI_PAY;
}

public PayState pay(PayContext, int amount){
// 支付宝支付
return payState;
}
}

微信支付

1
2
3
4
5
6
7
8
9
10
public class WxPay implement Payment{
public PayType getPayType(){
return PayType.WECHAT_PAY;
}

public PayState pay(PayContext, int amount){
// 微信支付
return payState;
}
}

使用

1
2
3
4
5
6
7
8
9
10
public static void main(String[] args){
Map<PayType,Payment> map = new HashMap(){{
put(PayType.WECHAT_PAY,new AliPay());
put(PayType.WECHAT_PAY,new WxPay());
}};
// 支付信息 - payContext
Payment payment = map.get(payContext.getType());
// 进行支付
payment.pay(payContext,100);
}

结合Spring依赖注入 的策略模式

1
2
3
4
5
6
7
8
9
10
11
12
13
@Service
public class PaymentFactory {
// spring注入到了这个List中
@Autowired
private List<Payment> paymentList;

/**
* 根据支付类型选择不同的支付方式
*/
public Payment getPayment(PayType type) {
// 同理
}
}
  • 也可以注入到map集合之中
  • 或者使用@PostConstruct注解,放入一个map集合之中。

参考链接:如何在 Spring 环境下优雅的实现策略模式 - 知乎 (zhihu.com)


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!