《Head First 设计模式》中关于策略模式的定义
定义算法蔟,分别封装起来,让他们之间可以相互替换,此模式让算法的变化独立与使用算法的客户。
假设有如下一个业务流程(非真实业务流程)需要实现,后续仍有可能接入其它支付渠道(京东支付/百度支付等)
就当前流程图描述的情况,简单实现的伪代码如下:
if (order.getPayChannel().equals("支付宝")) {
// 处理相关逻辑
// 调用支付宝付款接口
} else if (order.getPayChannel().equals("微信")) {
// 处理相关逻辑
// 调用微信付款接口
} else {
// 此支付渠道暂不支持
}
前面提到过后续可能会接入其它支付渠道,当项目上线后,需求来了!!!
这时新接入一个支付渠道,都需要找到判断支付渠道的代码逻辑,然后在这段代码中继续添加一个else if分支
我们可以将这段逻辑单独提取出来
首先我们定义一个付款渠道(PayChannel)的接口
public interface PayChannel {
// 获取支持的渠道
String getSupportChannel();
// 处理付款逻辑
Result pay(Order order);
}
每个渠道的逻辑处理都放在PayChannel接口的实现类中
@Component("alipayPayment")
public class AlipayPayment implements PayChannel {
public String getSupportChannel() {
return "alipay";
}
public Result pay(Order order) {
// 处理相关逻辑
// 调用支付宝付款接口
}
}
@Component("weChatPayment")
public class WeChatPayment implements PayChannel {
public String getSupportChannel() {
return "weChat";
}
public Result pay(Order order) {
// 处理相关逻辑
// 调用微信付款接口
}
}
然后修改原来的代码
注入付款渠道
@Autowired
private List<PayChannel> payChannelList;
调整原支付渠道的判断
for (PayChannel payChannel : payChannelList) {
if (order.getPayChannel().equals(payChannel.getSupportChannel()) {
payChannel.pay(order);
}
}
这样调整完成后,在需要接入新的付款渠道,就再也不用修改判断逻辑了(else if),只需要添加PayChannel的实现类即可