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;
    }
}

  • 9
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值