spring中使用设计模式优化ifelse

star2017 1年前 ⋅ 370 阅读

优化前

在代码中,经常会出现很多ifelse的语句,如:

if(网银支付){
代码1
}else if(微信支付){
代码2
}else if(支付宝支付){
代码3
}

订单支付模块,可能会有很多支付渠道,一般的做法可能是通过ifelse来判断使用哪个渠道。这样代码不友好,代码比较耦合。

优化后

使用策略模式来优化代码。策略模式:定义好规则,根据不同的规则执行不同的代码。
image.png

以支付模块为例:
支付接口

public interface PayStrategy {

    OrderInfo createOrderInfo(OrderInfo orderInfo);

}

微信策略类

public class WxpayStrategy implements PayStrategy {
    @Override
    public OrderInfo createOrderInfo(OrderInfo orderInfo) {
        System.out.println("微信支付");
        return null;
    }
}

支付宝策略类

public class AlipayStrategy implements PayStrategy {
    @Override
    public OrderInfo createOrderInfo(OrderInfo orderInfo) {
        System.out.println("支付宝支付");
        return null;
    }
}

上下文类

public class Context {
    private PayStrategy payStrategy;
    public void setStrategy(PayStrategy payStrategy){
        this.payStrategy = payStrategy;
    }
    public OrderInfo createOrderInfo(OrderInfo orderInfo){
        return payStrategy.createOrderInfo(orderInfo);
    }

}

测试类

public class Test {
    public static void main(String[] args) {
        Context context = new Context();
        context.setStrategy(new AlipayStrategy());
        context.createOrderInfo(new OrderInfo());
    }
}

spring整合策略模式

支付策略接口

public interface PayStrategy {

    PayTypeEnum payType();

    OrderInfo createOrderInfo(OrderInfo orderInfo);

}

微信策略类

@Service
public class WxpayStrategy implements PayStrategy {
    @Override
    public PayTypeEnum payType() {
        return PayTypeEnum.WXPAY;
    }

    @Override
    public OrderInfo createOrderInfo(OrderInfo orderInfo) {
        System.out.println("微信支付");
        return null;
    }
}

支付宝策略类

@Service
public class AlipayStrategy implements PayStrategy {
    @Override
    public PayTypeEnum payType() {
        return PayTypeEnum.ALIPAY;
    }

    @Override
    public OrderInfo createOrderInfo(OrderInfo orderInfo) {
        System.out.println("支付宝支付");
        return null;
    }
}

上下文类

@Service
public class Context {
    private PayStrategy getHandler(String payType){
        if(StringUtils.isEmpty(payType)){
            payType = ShareTypeEnum.ABOUT.getKey();
        }
        List<PayStrategy> strategies = SpringContextUtils.getBeans(PayStrategy.class);
        for (PayStrategy strategy : strategies) {
            if (strategy.payType().getKey().equals(payType)) {
                return strategy;
            }
        }
        throw new RuntimeException("异常");
    }

    public OrderInfo createOrderInfo(OrderInfo orderInfo,String payType){
        PayStrategy payStrategy = getHandler(payType);
        return payStrategy.createOrderInfo(orderInfo);
    }

}

枚举类

public enum PayTypeEnum {
    /**
     *
     */
    ALIPAY("alipay","支付宝"),
    WXPAY("wxpay","微信");

    String key;
    String value;

    PayTypeEnum(String key, String value) {
        this.key = key;
        this.value = value;
    }

    public String getKey() {
        return key;
    }

    public String getValue() {
        return value;
    }

    public static PayTypeEnum getEnumByKey(String key){
        for(PayTypeEnum payTypeEnum : PayTypeEnum.values()){
            if(payTypeEnum.getKey().equals(key)){
                return payTypeEnum;
            }
        }
        return null;
    }

}

测试类

public class Test extends BaseServiceTest {
    @Autowired
    private Context context;
    @org.junit.Test
    public void test(){
        context.createOrderInfo(new OrderInfo(),PayTypeEnum.ALIPAY.getKey());
    }
}

这样如果新增一种支付方式,你只需要新增一个策略处理类就可以了,对原先的业务没有任何影响。

本文为博主原创文章,未经博主允许不得转载。
更多内容请访问:IT源点

相关文章推荐

全部评论: 0

    我有话说: