「掘金者说」用注解代替if-else,让代码更优雅!

1,876 阅读3分钟

又到了周末,掘金者说总结了一下笔记。职场就是战场。如果一个职场人缺乏未雨绸缪的意识,整天不求上进或者刚愎自用,那么他的情况会很危险。

案例

直接上代码吧!需求,订单来源:分别为PC端和Mobile端,支付方式:有阿里支付、微信支付、银联支付。那么,if-else快速响应需求,为了完成任务,还是为了下班回家...


    public static final String PC = "pc";
    public static final String MOBILE = "mobile";
    public static final String ALI_PAY = "aliPay";
    public static final String WE_CHAT = "weChat";

    /**
     * 需求,订单来源:分别为PC端和Mobile端,支付方式:有阿里支付、微信支付、银联支付。
     * 那么,if-else快速响应需求,为了任务,还是为了下班回家...
     *
     * @param order
     */
    @Deprecated
    @Override
    public void orderServiceOld(Order order) {
        log.info("原有if-else(如果别的)写法");
        if (PC.equals(order.getSource())) {
            log.info("处理PC端订单的逻辑");
            // 处理PC端订单的逻辑
            if(ALI_PAY.equals(order.getPayMethod())){
                // 处理阿里支付订单的逻辑
            } else if (WE_CHAT.equals(order.getPayMethod())){
                // 处理微信支付订单的逻辑
            }
        } else if (MOBILE.equals(order.getSource())) {
            log.info("处理MOBILE端订单的逻辑");
            // 处理MOBILE端订单的逻辑
            if(ALI_PAY.equals(order.getPayMethod())){
                // 处理阿里支付订单的逻辑
            } else if (WE_CHAT.equals(order.getPayMethod())){
                // 处理微信支付订单的逻辑
            }
        } else {
            log.info("其他逻辑");
            // 其他逻辑
        }
    }

策略

策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 context 对象。策略对象改变 context 对象的执行算法。

使用策略模式去代替if-else。策略模式实现的方式都类似。主要是定义统一行为(接口或抽象类),并实现不同策略下的逻辑处理(对应实现类)。客户端使用时自己的选择相应的处理类,利用工程或者其他方式。

优点: 1、算法可以自由切换。 2、避免使用多重条件判断。 3、扩展性良好。

缺点: 1、策略类会增多。 2、所有策略类都需要对外暴露。

**注意事项:**如果一个系统的策略多于四个,就需要考虑使用混合模式,解决策略类膨胀的问题。

注解

订单处理为例,先总结下结构:

  1. 有一个订单的实体类Order

  2. 首先定义一个OrderHandler接口,用来规定订单处理的方法;

  3. 定义一个OrderHandlerType注解,表示某个类似用来处理何种来源的订单;

  4. 接来下就是实现PC端还是APP端订单处理的各种的handler,并添加上我们所定义的OrderHandlerType注解,分别为:MobileAliPayOrderHandlerMobileWeChatOrderHandlerPcAliPayOrderHandlerPcWeChatOrderHandler

  5. 准备就绪后,就是想spring容器中注入各种订单处理的handler,并在方法中,通过策略(订单来源)去确定选择哪个OrderHandler去处理订单;

  6. 在订单接口OrderService进行调用,通过订单来源确以及支付方式获取对应的handler;

总结

作为一个职场人,只有时刻保持清醒的头脑,学会审时度势,让自己拥有竞争力,才能在职场里站稳脚跟。

参考

别再用if-else了,用注解去代替他吧

策略模式