策略模式, 即根据不同的参数, 调用不同业务流程, 但各流程的逻辑基本类似.
真实场景
支付路由, 根据不同的渠道参数, 进行不同的调用. 但具有类似逻辑: 参数校验->本地创建订单->发送请求->根据结果做不同的处理.
AbstractChannel
抽象类, 定义了各渠道的整体架构
public abstract class AbstractChannel {
public void handle() {
check();
createOrder();
String result = doRequest();
processResult(result);
}
private void createOrder() {
// 创建本地订单
System.out.println("Create order");
}
/**
* 执行请求结果
* @param result 请求结果
*/
private void processResult(String result) {
if (result == null) {
throw new RuntimeException("Result is null");
}
switch (result) {
case "success":
System.out.println("Process success");
break;
case "failed":
System.out.println("Process failed");
break;
}
System.out.println("Process finished");
}
/**
* 发起请求
*/
public abstract String doRequest();
/**
* 检查参数
*/
public abstract void check();
}
Channel
定义3个渠道
@Service("alipay")
public class AlipayChannel extends AbstractChannel {
@Override
public void check() {
System.out.println("Alipay check...");
}
@Override
public String doRequest() {
System.out.println("Alipay doHandle...");
return "success";
}
}
@Service("sinaPay")
public class SinaPayChannel extends AbstractChannel {
@Override
public void check() {
System.out.println("SinaPay check...");
}
@Override
public String doRequest() {
System.out.println("SinaPay doHandle...");
return "success";
}
}
@Service("wechatPay")
public class WechatPayChannel extends AbstractChannel {
@Override
public void check() {
System.out.println("WechatPay check...");
}
@Override
public String doRequest() {
System.out.println("WechatPay doHandle...");
return "success";
}
}
Controller
测试入口
@RestController
public class IndexController {
@Autowired
Map<String, AbstractChannel> channelMap;
@GetMapping("/strategy")
public Object strategy(@RequestParam("channel") String channel) {
channelMap.get(channel).handle();
return null;
}
}
测试结果
访问 http://127.0.0.1:8080/strategy?channel=alipay
AliPay check...
Create order
AliPay doHandle...
Process success
Process finished