公司里的公众号要做支付功能,对接第三方支付,目前有微信支付、支付宝支付、京东支付。为了能够快速上线,需求了解清楚后我们就开始实现代码如下了:
@Service
public class PayService {
public void pay(String payType){
if("weixin".equals(payType)){
this.weixinPay();
} else if("ali".equals(payType)){
this.aliPay();
}else if("jingdong".equals(payType)){
this.jingdongPay();
}
}
private void weixinPay(){
//todo 微信支付
}
private void aliPay(){
//todo 支付宝支付
}
private void jingdongPay(){
//todo 京东支付
}
}
根据不同的支付方式,只需要在weixinPay(),aliPay(),jingdongPay()方法里面实现对应的逻辑即可。
由于每种支付方式的逻辑都不一样,为了赶进度,我们安排了3个人各自实现对应支付方式逻辑,这时就碰到一个问题:3个人修改的都是PayService这个文件,导致开发过程中经常有版本冲突,要不断进行代码合并,影响开发效率。
因此我们将各种支付方式独立为独立的实现类,代码如下:
@Service
public class WeixinPay {
public void pay() {
//todo 微信支付
}
}
@Service
public class AliPay {
public void pay() {
//todo 支付宝支付
}
}
@Service
public class JingdongPay {
public void pay() {
//todo 京东支付
}
}
此时PayService代码调整为:
@Service
public class PayService {
@Autowired
private WeixinPay weixinPay;
@Autowired
private AliPay aliPay;
@Autowired
private JingdongPay jingdongPay;
public void pay(String payType){
if("weixin".equals(payType)){
weixinPay.pay();
} else if("ali".equals(payType)){
aliPay.pay();
}else if("jingdong".equals(payType)){
jingdongPay.pay();
}
}
}
现在解决了代码冲突的问题了,每种支付方式的负责人只要把自己负责的支付逻辑完成即可。但是下次如果再来个美团支付,要怎么做?是不是要加一个MeituanService,然后修改PayService中的pay方法,加个if("meituan".equals(payType))的判断?
可以看到这个if else的判断会越来越长,而且每次新增支付方式我们都要修改一次,违反了开闭原则。
我们来做个调整如下:
1,新建一个枚举类
public enum PayTypeEnum {
WEIXIN, ALI, JINGDONG, MEITUAN
}
2,新建一个接口
@Service
public interface IPay {
boolean supportPayType(String payType);
void pay();
}
3,各支付方式实现该接口
@Service
public class WeixinPay implements IPay{
@Override
public boolean supportPayType(String payType) {
return PayTypeEnum.WEIXIN.toString().equals(payType);
}
public void pay() {
//todo 微信支付
}
}
@Service
public class AliPay implements IPay{
@Override
public boolean supportPayType(String payType) {
return PayTypeEnum.ALI.toString().equals(payType);
}
public void pay() {
//todo 支付宝支付
}
}
@Service
public class JingdongPay implements IPay {
@Override
public boolean supportPayType(String payType) {
return PayTypeEnum.JINGDONG.toString().equals(payType);
}
public void pay() {
//todo 京东支付
}
}
@Service
public class MeituanPay implements IPay {
@Override
public boolean supportPayType(String payType) {
return PayTypeEnum.MEITUAN.toString().equals(payType);
}
public void pay() {
//todo 美团支付
}
}
3,payService实现
@Service
public class PayService implements ApplicationContextAware, InitializingBean {
private ApplicationContext applicationContext;
private List<IPay> iPayList;
@Override
public void afterPropertiesSet() throws Exception {
if (!CollectionUtils.isEmpty(iPayList)) {
return;
}
iPayList = new ArrayList<>();
Map<String, IPay> iPayMap = applicationContext.getBeansOfType(IPay.class);
for (Map.Entry<String, IPay> entry : iPayMap.entrySet()) {
iPayList.add(entry.getValue());
}
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.applicationContext = applicationContext;
}
public void pay(String payType) {
for (IPay iPay : iPayList) {
if (iPay.supportPayType(payType)) {
iPay.pay();
}
}
}
}
经过调整后,下次如果需要新增支付方式,只需要在枚举类中加一种类型,然后新增一个支付实现类实现IPay接口即可。











网友评论