静态工厂模式 + 策略模式 >>> 优化臃肿if else

因为工作业务需求,需要用到。之前就想写一个关于代码优化的文章。今天补一下

 

我所有的父接口   业务实现所需

/**
 * @Auther: zorro
 * @Date: 2019/3/4 18:33
 * @Description:
 */
public interface PayApi extends InitializingBean {
    /**
     * 主动支付
     * @param basePayDto
     * @return
     */
    BaseResult submitPay(BasePayDto basePayDto);

    /**
     * 退款
     * @param refundDto
     * @return
     */
    BaseResult refundPay(RefundDto refundDto);
}

新建一个工厂接口,为了以后别人也要重写这个工厂

/**
 * @author youao.du@gmail.com
 * @create 2019-03-07 10:21
 */
public interface PayFactory {

    /**
     * 获取一个Pay对象
     * @param payType
     * @return
     */
    PayApi createPayApi(String payType);

    /**
     * 注册接口
     * @param key
     * @param params
     */
    void register(String key, PayApi params);
}

接下来实现类

/**
 * @author youao.du@gmail.com
 * @create 2019-03-07 10:23
 */
@Component
public class PayFactoryImpl implements PayFactory {

    // 工厂集合
    private static Map<String, PayApi> payApiMap = new HashMap<>();

    /**
     * 获取一个实例对象
     * @param payType
     * @return
     */
    @Override
    public PayApi createPayApi(String payType) {
        PayApi result = payApiMap.get(payType);
        // 因为我的义务需求就是,如果你没有注册到我的这个厘米。他给返回的就是空,所以就无所谓了
        return result == null ? null : result;
    }

    /**
     * 工厂注册机制
     * @param key
     * @param params
     */
    @Override
    public void register(String key, PayApi params) {
        payApiMap.put(key, params);
    }
}

现在基本完成。接下来实现我的公共接口就好了

/**
 * @author youao.du@gmail.com
 * @create 2019-03-04 18:32
 */
@Component
public class HuiChaoPayApi implements PayApi{

    @Autowired
    private PayFactory payFactory;

    /**   
     * 主动支付
     * @param basePayDto
     * @return
     */
    @Override
    public BaseResult submitPay(BasePayDto basePayDto) {
        return null;
    }

    /**
     * 退款
     * @param refundDto
     * @return
     */
    @Override
    public BaseResult refundPay(RefundDto refundDto) {
        return null;
    }

    /**
     * 把类注册到工厂中
     */
    @Override
    public void afterPropertiesSet() {  
        // 这个方法当创建Bean之后就会执行,所以不用担心把对象注册到工厂中,需要注意的是key值不可重复因为工厂中用的是map key值重复会进行覆盖
        payFactory.register("huichao", this);
    }
}

使用的时候只需要一行代码即可实例化一个对象,方便以后扩充 

/**
 * @author youao.du@gmail.com
 * @create 2019-03-06 21:24
 */
@RestController
public class RePayController {

    @Autowired
    private PayFactory payFactory;

    @PostMapping("refundPay")
    public ResponseMessage refundPay(RefundDto refundDto){
        PayApi huichao = payFactory.createPayApi("huichao");
        try {
            return ResponseMessage.ok(huichao.refundPay(refundDto));
        } catch (BusinessException e){
            return ResponseMessage.error(e.getMessage());
        }
    }
}

最近学习代码重构。这是第一章中提到的。现学现用   大佬轻喷

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值