使用策略模式优雅的实现多种支付方式(支付宝、微信),或者多种支付场景(订单、维修金)的业务,且方便扩展。
下例是使用注解配合反射方式,扫描到所有的具体的支付策略并放到map集合中,然后根据前端传递来的支付类型参数,选择对应的支付策略,完成支付过程。
如上图:
PayStrategy是支付策略接口;
OrderPay(订单支付),RepairPay(维修金支付)是具体的支付策略(支付场景);
AbstractPayService是实现PayStrategy接口的抽象类,规定了支付的流程,在其中选择具体的支付策略,为controller提供支付接口;
PayServiceImpl实现AbstractPayService中规定的支付流程的具体步骤,通过PayStrategyFactory获取实际的支付策略class,通过BeansUtil返回spring容器中的策略实现类bean;
PayStrategyFactory通过扫描被Pay注解注释的类,获得所有支付策略的类型和class;
Pay注解表名被注解的类是一个具体的支付策略,可以设置支付类型。
具体代码如下:
PayStrategy
package com.zhya.strategy.service;
/**
* 支付策略
*
* @author zhangyang
* @date 2018/11/14
**/
public interface PayStrategy {
/**
* 支付前准备支付参数
*
* @param payFor
* @return
*/
boolean prePay(String payFor);
/**
* 支付后处理支付回调结果
*
* @param payFor
* @param isPaySuccess
*/
void afterPay(String payFor, boolean isPaySuccess);
}
Pay注解
package com.zhya.strategy.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* 支付策略
*
* @author zhangyang
* @date 2018/11/14
**/
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface Pay {
/**
* 支付