前言
在开发时,总会遇到支付的需求,但是支付的方式有很多,支付宝支付,微信支付,银行卡支付,每种支付方式的接口不一样,参数信息也不一样,一般情况下,会有很多if/else来进行判断,但是业务逻辑的逐渐增多,if/else显得那么的沉重,通过策略模式即可更优雅的来处理这种代码。
什么是策略模式呢?比如一个人要从广州去北京,这个人可以选择乘坐飞机去,也可以选择乘坐火车去。两种交通方式的选择,可以认为是两种策略。映射到程序中,可以认为是两种算法,比如支付的时候,选择支付宝支付或者微信支付。
策略模式的特点是不管过程怎么样,结果都是一样的。不管乘坐飞机还是火车,最后都会到达北京;不管哪种支付方式,最终都会支付成功。过程不一样,结果都一样。
一、支付案例
支付时,会有很多参数,很多逻辑,经常会遇到一种支付方式,上百行的代码,而且还需要很好的把控事务。如果多种支付方式,代码也会成倍的上涨。维护起来相当难受。
1.普通代码
代码如下(示例):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| @PostMapping("/makeOrder") public ResultData makeOrder(@RequestBody Order order){
if(order.getType=="alipay"){ this.payService.alipay(order); }else if (order.getType=="weixin"){ this.payService.weixinpay(order); }else if (order.getType=="jd"){ this.payService.jtpay(order); }else if (order.getType=="yunshanfu"){ this.payService.yunshanfupay(order); } return this.ok(order); }
|
相信代码肯定会很多,而且if/else来处理会显得代码很杂乱。或者有通过增加接口来减少if/else
1 2 3 4 5 6 7 8
| @PostMapping("/alipay") public ResultData makeOrder(@RequestBody Order order){
} @PostMapping("/jdpay") public ResultData makeOrder(@RequestBody Order order){
}
|
现在逻辑少,代码不会显得杂乱,如果有很多种支付方式呢?代码会显得很杂乱,而且扩展受限。推荐阅读:最新 Java 核心技术教程。
2.引入策略模式
代码如下(入口):
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| private OrderService orderService;
@PostMapping("/makeOrder")
public ResultData makeOrder(Long goodsId,String type){ Order order = this.orderService.makeOrder(goodsId); PayType payType = PayType.getByCode(type); payType.get().pay(order.getId(),order.getAmount()); return this.ok(); }
|
代码如下(支付方式):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| public enum PayType { ALI_PAY("1",new AliPay()), WECHAT_PAY("2",new WechatPay());
private String payType; private Payment payment; PayType(String payType,Payment payment){ this.payment = payment; this.payType = payType; } public Payment get(){ return this.payment;} public static PayType getByCode(String payType) { for (PayType e : PayType.values()) { if (e.payType.equals(payType)) { return e; } } return null; } }
|
代码如下(支付接口):
1 2 3
| public interface Payment { public void pay(Long order, double amount); }
|
代码如下(支付宝支付实现):
1 2 3 4 5 6 7
| public class AliPay implements Payment { @Override public void pay(Long order, double amount) { System.out.println("----支付宝支付----"); System.out.println("支付宝支付111元"); } }
|
代码如下(微信支付实现):
1 2 3 4 5 6 7
| public class WechatPay implements Payment { @Override public void pay(Long orderId, double amount) { System.out.println("---微信支付---"); System.out.println("支付222元"); } }
|
通过枚举来优雅的选择支付类型,共用一个支付接口,不同的支付方式实现自己的逻辑,更加贴合面向对象的思想。这种方式相对与if/else更加优雅。单例模式的 8 种写法,推荐看下。
但是,其实这样一看,哇,使用策略模式,创建了好多类,好麻烦的样子,还是使用if/else代码少一点,但是长远来说,支付的逻辑一定是错综复杂,通过策略模式可以更加友好的进行扩展。但是if/else进行扩展,代码会比较冗余,如果本来就没几行代码,缺强制使用策略模式,无意是画蛇添足。