聚合支付平台
比如搭建聚合支付平台的时候,这时候需要对接很多第三方支付接口,比如支付宝、微信支付、小米支付等。
通过传统if代码判断的,后期的维护性非常差!
public String toPayHtml2(String payCode){ if(payCode.equals("ali_pay")){ return "调用支付宝接口..."; } if(payCode.equals("xiaomi_pay")){ return "调用小米支付接口"; } if(payCode.equals("yinlian_pay")){ return "调用银联支付接口..."; } return "未找到该接口..."; } |
这时候可以通过策略模式解决多重if判断问题。
为什么叫做策略模式
每个if判断都可以理解为就是一个策略。
什么是策略模式
策略模式是对算法的包装,是把使用算法的责任和算法本身分割开来,委派给不同的对象管理,最终可以实现解决多重if判断问题。
1.环境(Context)角色:持有一个Strategy的引用。
2.抽象策略(Strategy)角色:这是一个抽象角色,通常由一个接口或抽象类实现。此角色给出所有的具体策略类所需的接口。
3.具体策略(ConcreteStrategy)角色:包装了相关的算法或行为。
定义策略接口->实现不同的策略类->利用多态或其他方式调用策略
聚合支付平台转为策略模式架构思想如下
PayContextStrategy为调用算法角色,
PayStrategy 为支付算法接口
AliPayStrategy,YinLianPayStrategy等为调用算法实际实现
具体逻辑为
1web端请求支付 带上支付方式的pay_code
2control接受到请求 使用PayContextStrategy调用具体支付算法
3PayContextStrategy根据pay_code重数据库拿到具体的支付算法实现类的bean名称,最后获取bean调用算法实现。
扩展: PayContextStrategy本身也继承一个接口 ,接口的实现类可以通过数据库获取bean,也能通过缓存,也能通过配置文件,这样扩展可以理解为桥接模式。
PayStrategy(抽象角色)
public interface PayStrategy {
/**
* 共同算法实现骨架
* @return
*/
public String toPayHtml();
} |
ConcreteStrategy (具体实现角色)
@Component public class AliPayStrategy implements PayStrategy { public String toPayHtml() { return "调用支付宝支付接口"; } } |
@Component public class XiaoMiPayStrategy implements PayStrategy { public String toPayHtml() { return "调用小米支付接口"; } } |
PayContextService (上下文)
@RestController public class PayContextService {
@Autowired private PaymentChannelMapper paymentChannelMapper; @Autowired private SpringUtils springUtils; @RequestMapping("/toPayHtml") public String toPayHtml(String payCode){ // 1.验证参数 if(StringUtils.isEmpty(payCode)){ return "payCode不能为空!"; } // 2.使用PayCode查询 PaymentChannelEntity paymentChannel = paymentChannelMapper.getPaymentChannel(payCode); if(paymentChannel==null){ return "该渠道为空..."; } // 3.获取策略执行的beanid String strategyBeanId = paymentChannel.getStrategyBeanId(); // 4.使用strategyBeanId获取对应spring容器bean信息 PayStrategy payStrategy = springUtils.getBean(strategyBeanId, PayStrategy.class); // 5.执行具体策略算法 return payStrategy.toPayHtml(); }
} 具体代码 github地址:https://github.com/919337588/springboot_strategy |