springboot 工厂加策略模式 优化if else
首先定义策略接口
策略接口
public interface PayBusiness {
//支付方法
Result pay(PaymentParamsDTO paymentParamsDTO,Long userId);
//回调方法
void payBack(PayDetails payDetails);
}
实现PayBusiness 策略的实现类
OrderBusinessImpl 订单支付回调策略
import cn.hutool.core.util.ObjectUtil;
import com.sqx.common.Emu.BusinessEnum;
import com.sqx.common.utils.DateUtils;
import com.sqx.common.utils.Result;
import com.sqx.common.utils.SpringContextUtils;
import com.sqx.modules.errand.entity.Indent;
import com.sqx.modules.errand.service.IndentService;
import com.sqx.modules.pay.entity.PayDetails;
import com.sqx.modules.pay.service.PayDetailsService;
import com.sqx.modules.payment.common.PayUtils;
import com.sqx.modules.payment.factory.service.PayBusiness;
import com.sqx.modules.payment.formDto.paymentParamsDTO;
import com.sqx.modules.utils.uuid.IdUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.util.Date;
/**
* @description:TODO
* @author: qiao
* @create: 2024/4/26 13:40
*/
@Service
public class OrderBusinessImpl implements PayBusiness {
public static final int IDENTIFIER = 2;
private final IndentService indentService;
private final PayDetailsService payDetailsService;
public OrderBusinessImpl(IndentService indentService, PayDetailsService payDetailsService) {
this.indentService = indentService;
this.payDetailsService = payDetailsService;
}
@Override
public Result pay(PaymentParamsDTO paymentParamsDTO, Long userId) {
Long businessId = paymentParamsVO.getBusinessId();
//支付方式 6paypal 7stripe
Integer payment = paymentParamsDTO.getPayment();
if (ObjectUtil.isNull(businessId)){
return Result.error("60191");
}
Indent indent = indentService.getById(businessId);
if (ObjectUtil.isNull(indent)){
return Result.error("50004");
}else {
Long userId1 = indent.getUserId();
BigDecimal indentMoney = indent.getIndentMoney();
String indentNumber = indent.getIndentNumber();
if (StringUtils.isEmpty(indentNumber)){
indentNumber= IdUtils.getGeneralOrder();
}
PayDetails payDetails = new PayDetails();
payDetails.setClassify(paymentParamsVO.getPayment());
//1金额充值 2订单支付 3缴纳保证金 4补缴保证金
payDetails.setType(BusinessEnum.PAY_TYPE_ORDER.getCode());
payDetails.setMoney(indentMoney.doubleValue());
payDetails.setOrderId(indentNumber);
payDetails.setState(BusinessEnum.PAY_STATE_UNPAID.getCode());
payDetails.setClassify(payment);
payDetails.setCreateTime(DateUtils.format(new Date()));
payDetails.setUserId(userId1);
payDetailsService.savePaydetails(payDetails);
if (payment.equals(BusinessEnum.PAY_CLASSIFY_PAYPAL.getCode())){
//paypal
Result result = PayUtils.payPal(indentNumber, String.valueOf(indentMoney), paymentParamsDTO.getPayWay());
return result;
}else {
//stripe
Result stripe = PayUtils.stripe(indentMoney, indentNumber, paymentParamsDTO.getPayWay());
return stripe;
}
}
}
@Override
public void payBack(PayDetails payDetails) {
//订单支付
Indent indent = indentService.findIndentByPayOrdersNo(payDetails.getOrderId());
indentService.indentPayCallback(indent.getIndentId(), payDetails.getClassify(), BigDecimal.valueOf(payDetails.getMoney()));
}
}
TopUpBusinessImpl 金额充值支付、回调策略类
import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.sqx.common.Emu.BusinessEnum;
import com.sqx.common.utils.DateUtils;
import com.sqx.common.utils.Result;
import com.sqx.modules.app.dao.UserMoneyDao;
import com.sqx.modules.app.entity.UserMoney;
import com.sqx.modules.app.entity.UserMoneyDetails;
import com.sqx.modules.app.service.UserMoneyDetailsService;
import com.sqx.modules.app.service.UserMoneyService;
import com.sqx.modules.pay.entity.PayDetails;
import com.sqx.modules.pay.service.PayDetailsService;
import com.sqx.modules.payment.common.PayUtils;
import com.sqx.modules.payment.factory.service.PayBusiness;
import com.sqx.modules.payment.formDto.paymentParamsDTO;
import com.sqx.modules.rechargeConfig.entity.RechargeConfig;
import com.sqx.modules.rechargeConfig.service.RechargeConfigService;
import com.sqx.modules.tbCoupon.entity.TbCoupon;
import com.sqx.modules.tbCoupon.service.TbCouponService;
import com.sqx.modules.tbCoupon.service.TbCouponUserService;
import com.sqx.modules.utils.uuid.IdUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* @description:TODO 充值
* @author: qiao
* @create: 2024/4/26 15:44
*/
@Service
@Slf4j
public class TopUpBusinessImpl implements PayBusiness {
public static final int IDENTIFIER = 1;
private final RechargeConfigService rechargeConfigService;
private final PayDetailsService payDetailsService;
private final UserMoneyDao userMoneyDao;
private final UserMoneyService userMoneyService;
private final UserMoneyDetailsService userMoneyDetailsService;
private final TbCouponService tbCouponService;
private final TbCouponUserService tbCouponUserService;
public TopUpBusinessImpl(RechargeConfigService rechargeConfigService, PayDetailsService payDetailsService, UserMoneyDao userMoneyDao,
UserMoneyService userMoneyService, UserMoneyDetailsService userMoneyDetailsService, TbCouponService tbCouponService,
TbCouponUserService tbCouponUserService) {
this.rechargeConfigService = rechargeConfigService;
this.payDetailsService = payDetailsService;
this.userMoneyDao = userMoneyDao;
this.userMoneyService = userMoneyService;
this.userMoneyDetailsService = userMoneyDetailsService;
this.tbCouponService = tbCouponService;
this.tbCouponUserService = tbCouponUserService;
}
@Override
public Result pay(PaymentParamsDTO paymentParamsDTO, Long userId) {
Long businessId = paymentParamsDTO.getBusinessId();
Integer payment = paymentParamsDTO.getPayment();
String generalOrder = IdUtils.getGeneralOrder();
PayDetails payDetails = new PayDetails();
payDetails.setOrderId(generalOrder);
payDetails.setUserId(userId);
if (ObjectUtil.isNull(businessId)){
payDetails.setMoney(paymentParamsDTO.getPayMoney().doubleValue());
}else {
RechargeConfig rechargeConfig = rechargeConfigService.getById(businessId);
if (ObjectUtil.isNull(rechargeConfig)){
return Result.error("60192");
}else {
BigDecimal money = rechargeConfig.getMoney();
payDetails.setMoney(money.doubleValue());
}
}
payDetails.setClassify(payment);
payDetails.setType(BusinessEnum.PAY_TYPE_TOPUP.getCode());
payDetails.setState(BusinessEnum.PAY_STATE_UNPAID.getCode());
payDetails.setCreateTime(DateUtils.format(new Date()));
payDetailsService.savePaydetails(payDetails);
if (payment.equals(BusinessEnum.PAY_CLASSIFY_PAYPAL.getCode())){
//paypal
Result result = PayUtils.payPal(generalOrder, String.valueOf(payDetails.getMoney()), paymentParamsDTO.getPayWay());
return result;
}else {
//stripe
Result stripe = PayUtils.stripe(BigDecimal.valueOf(payDetails.getMoney()), generalOrder, paymentParamsDTO.getPayWay());
return stripe;
}
}
@Override
public void payBack(PayDetails payDetails) {
//修改用户钱包余额
int count = userMoneyDao.selectCount(new QueryWrapper<UserMoney>().eq("user_id", payDetails.getUserId()));
//如果用户钱包不存在
if (count == 0) {
UserMoney userMoney = new UserMoney();
userMoney.setMoney(BigDecimal.ZERO);
userMoney.setUserId(payDetails.getUserId());
userMoneyDao.insert(userMoney);
}
userMoneyService.updateMoney(1, payDetails.getUserId(), payDetails.getMoney());
UserMoneyDetails userMoneyDetails = new UserMoneyDetails();
userMoneyDetails.setMoney(BigDecimal.valueOf(payDetails.getMoney()));
userMoneyDetails.setUserId(payDetails.getUserId());
userMoneyDetails.setUserType(1);
userMoneyDetails.setTitle("充值金额");
userMoneyDetails.setContent("支付宝充值金额:" + payDetails.getMoney());
userMoneyDetails.setClassify(4);
userMoneyDetails.setType(1);
userMoneyDetails.setCreateTime(new SimpleDateFormat("yyyy-MM-dd :HH:mm:ss").format(new Date()));
userMoneyDetailsService.save(userMoneyDetails);
RechargeConfig rechargeConfig = rechargeConfigService.getById(payDetails.getParentId());
TbCoupon tbCoupon = tbCouponService.getById(rechargeConfig.getCouponId());
if (tbCoupon != null) {
for (int i = 0; i < rechargeConfig.getCouponNum(); i++) {
tbCouponUserService.giveCoupon(tbCoupon, payDetails.getUserId());
}
}
}
}
创建策略工厂类,用于根据条件返回相应的策略对象:
import com.sqx.common.exception.SqxException;
import com.sqx.modules.payment.factory.service.PayBusiness;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* @description:TODO 1金额充值 2订单支付 3缴纳保证金 4补缴保证金
* @author: qiao
* @create: 2024/4/26 13:39
*/
@Component
public class PayBusinessFactory {
private final Map<Integer, PayBusiness> strategyMap;
@Autowired
public PayBusinessFactory(List<PayBusiness> strategyList) {
this.strategyMap = new HashMap<>();
for (PayBusiness strategy : strategyList) {
try {
Field identifier = strategy.getClass().getDeclaredField("IDENTIFIER");
if (identifier != null && int.class.equals(identifier.getType())){
identifier.setAccessible(true);
int identifierInt = identifier.getInt(null);
strategyMap.put(identifierInt,strategy);
}
} catch (Exception e) {
throw new SqxException("60194",e);
}
}
}
public PayBusiness getStrategy(Integer key){
PayBusiness strategy = strategyMap.get(key);
return strategy;
}
}
在需要使用策略的地方,我们不再使用if-else语句,而是使用策略工厂来获取并执行策略
import com.sqx.common.utils.Result;
import com.sqx.modules.payment.factory.PayBusinessFactory;
import com.sqx.modules.payment.factory.service.PayBusiness;
import com.sqx.modules.payment.formDto.PaymentParamsDTO ;
import com.sqx.modules.payment.service.PaymentService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
/**
* @description:TODO
* @author: qiao
* @create: 2024/4/26 13:34
*/
@Service
@Slf4j
public class PaymentServiceImpl implements PaymentService {
@Resource
private PayBusinessFactory payBusinessFactory;
@Override
public Result pay(PaymentParamsDTO paymentParamsDTO, Long userId) {
//支付渠道
Integer payment = paymentParamsDTO.getBusinessType();
PayBusiness byKey = payBusinessFactory.getStrategy(payment);
Result pay = byKey.pay(paymentParamsDTO, userId);
return pay;
}
}