#在Spring boot中使用策略模式
最近在项目中看到别人的代码,是用几个if语句或者switch case语句来写的,所以就想使用策略模式进行重构,体验设计模式带来的便捷。话多说先上代码这里写代码片。
假设有三种支付方式,支付宝支付aliPay,微信支付wxPay,刷卡cardPay这三种支付方式,并且假设每种支付只有一种支付方式,不可用组合。首先先看不使用策略模式的代码。
public void unUsedTest(String type) {
switch (type) {
case "wxPay":
System.out.println("wxPay");
break;
case "aliPay":
System.out.println("aliPay");
break;
case "cardPay":
System.out.println("cardPay");
break;
default:
System.out.println("不支持该支付方式");
}
}
现在我们使用策略模式进行改造,首先我们写一个接口,里面有两个方法,support()用来判断是否执行业务操作,用process()来执行业务操作。
接口类:
public interface PayTypeHandler {
boolean support(String payType);
void process(String payType);
}
然后我们写主实现类
@Component
@Primary
@RequiredArgsConstructor
public class CompositePayTypeHandler implements PayTypeHandler {
private final List<PayTypeHandler> payTypeHandlers;
@Override
public boolean support(String payType) {
return payTypeHandlers.stream()
.anyMatch(payTypeHandler -> payTypeHandler.support(payType));
}
@Override
public void process(String payType) {
payTypeHandlers.stream().filter(payTypeHandler -> payTypeHandler.support(payType))
.findFirst()
.ifPresent(payTypeHandler -> payTypeHandler.process(payType));
}
}
然后我们写微信支付的实现类,我们也必须得重写两个方法,support()和process()方法。
@Component
public class WXPayHandler implements PayTypeHandler {
@Override
public boolean support(String payType) {
return StringUtil.equals(payType, "wxPay");
}
@Override
public void process(String payType) {
System.out.println("这是微信支付");
}
}
刷卡支付和支付宝支付也是一样的,只是判断条件不同而已,代码如下:
@Component
public class CardPayHandler implements PayTypeHandler {
@Override
public boolean support(String payType) {
return StringUtil.equals(payType, "cardPay");
}
@Override
public void process(String payType) {
System.out.println("这是刷卡支付");
}
}
@Component
public class AliPayHandler implements PayTypeHandler {
@Override
public boolean support(String payType) {
return StringUtil.equals(payType, "aliPay");
}
@Override
public void process(String payType) {
System.out.println("这是支付宝支付");
}
}
接下来我贴上使用策略模式之后的代码
public void usedTest(String type) {
if (payTypeHandler.support(type)) {
System.out.println("不支持该支付方式");
return;
}
payTypeHandler.process(type);
}
总结一下:
策略模式可以解耦,将实现类的创建交给了spring来管理,使我们代码可读性提高。