因为工作业务需求,需要用到。之前就想写一个关于代码优化的文章。今天补一下
我所有的父接口 业务实现所需
/**
* @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());
}
}
}
最近学习代码重构。这是第一章中提到的。现学现用 大佬轻喷