整合策略-工厂模式 优化支付 if/eles

1.创建一个枚举 定义需要实现的支付类型

public enum PayEnum {

    zfb_pay("0","支付宝支付"),
    wx_pay("1","微信支付"),
    other_pay("2","其他支付"),
    ;

    private String code;
    private String desc;

    PayEnum(String code, String desc) {
        this.code = code;
        this.desc = desc;
    }
    public static PayEnum getCode(String code) {
        PayEnum[] values = PayEnum.values();
        List<PayEnum> collect = Arrays.stream(values).filter(payEnum -> payEnum.code.equals(code)).collect(Collectors.toList());
        if (CollectionUtils.isNotEmpty(collect)){
            return collect.get(0);
        }
        return PayEnum.other_pay;
    }

}

2.定义工厂模型 将所有的实现类 都交给工厂方式去调用

@Component
public class PayFactoryImpl implements InitializingBean {
        /**
     * @Description
     * InitializingBean描述:是Spring提供的拓展性接口,InitializingBean接口为bean提供了属性初始化后的处理方法,它只有一个afterPropertiesSet方法,凡是继承该接口的类,在bean的属性初始化后都会执行该方法
     * 类职责描述:
        工厂类实现InitializingBean方式   在springboot 启动之后将支付实现类都注入对应
    payServiceMap 中,控制层根据code 获取对应实现类
     * 优点 : 实现类的单一指责性 增加代码可视性 以及扩展性
     */
    @Resource
    private List<PayService> payServicesList;

    private Map<PayEnum,PayService> payServiceMap = new HashMap<>();

    public PayService getPayServiceByCode(String code){
        PayEnum payEnum = PayEnum.getCode(code);
        return payServiceMap.get(payEnum);
    }
    @Override
    public void afterPropertiesSet()  {
        for (PayService payService : payServicesList) {
            payServiceMap.put(payService.payenum(),payService);
        }
    }
}

3.定义接口以及实现类

public interface PayService {
    PayEnum payenum();

    R pay();

    R findPay();

}

@Service
public class ZfbPaySercieImpl implements PayService {
    
    @Override
    public PayEnum payenum() {
        //根据支付枚举  确定要调用的实现类
        return PayEnum.zfb_pay;
    }

    @Override
    public R pay() {
        System.out.println("支付宝支付");
        return R.ok();
    }

    @Override
    public R findPay() {
        System.out.println("支付宝支付 查询");
        return R.ok();
    }
}

@Service
public class WxPaySercieImpl implements PayService {
    
    @Override
    public PayEnum payenum() {
        //根据支付枚举  确定要调用的实现类
        return PayEnum.wx_pay;
    }

    @Override
    public R pay() {
        System.out.println("微信支付");
        return R.ok();
    }

    @Override
    public R findPay() {
        System.out.println("weixin支付 查询");
        return R.ok();
    }
}


4.测试示例

@RestController
@RequestMapping("/test")
public class TestWeb {

    @Resource
    private PayFactoryImpl payFactory;
    @GetMapping("/test1")
    public R test() {
        R pay = payFactory.getPayServiceByCode("1").pay();
        System.out.println(pay);
        R pay1 = payFactory.getPayServiceByCode("1").findPay();
        System.out.println("pay1 = " + pay1);
        return R.ok();
    }

}

输出结果:

微信支付
{code=200, message=操作成功}
weixin支付 查询
pay1 = {code=200, message=操作成功}

注意:InitializingBean 是springboot启动后才执行的 新增方式需要重启应用 否则spring无法注入

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值