《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的实现类即可

相关文章: