枚举策略代替项目中大片的if-else

之前看过很多用策略模式代替if-else的文章,看过之后受到启发,于是我也在项目中应用了策略模式,但是我用的是枚举策略替换掉了项目中大片的if-else。并且在Effective Java 第二版的第30条中推荐使用枚举策略模式,所以用一个小demo记录一下枚举策略模式

不使用策略模式

如果不使用策略模式,那么代码就会像如下一样,看起来很臃肿。

	public String handle(OrderDTO dto) {
        String type = dto.getType();
        if ("1".equals(type)) {
            return "处理普通订单";
        } else if ("2".equals(type)) {
            return "处理团购订单";
        } else if ("3".equals(type)) {
            return "处理促销订单";
        }
        return null;
    }
什么是策略模式

策略模式是一种常见的设计模式,应用比较简单,官方定义是:定义一组算法,将每个算法都封装起来,并且使他们之间互相转换。策略模式的核心就是面向对象的继承和多态机制。之前写过一篇策略模式的文章,不太了解策略模式的小伙伴可以先去看看,然后再回来看下文。

枚举策略模式实现处理订单
  • 策略模式通用类图

枚举策略代替项目中大片的if-else_第1张图片

  • 定义一个策略枚举类
@AllArgsConstructor
@Getter
public enum OrderEnum {

    /**
     * 处理普通订单
     */
    NORMAL_TYPE {
        @Override
        public String handle() {
            return "处理普通订单";
        }
    },

    /**
     * 处理团购订单
     */
    GROUP_TYPE {
        @Override
        public String handle() {
            return "处理团购订单";
        }
    },

    /**
     * 处理促销订单
     */
    PROMOTION_TYPE {
        @Override
        public String handle() {
            return "处理促销订单";
        }
    };

    public abstract String handle();
}
  • 测试
	@Test
    void strategyTest() {
        String handle1 = OrderEnum.NORMAL_TYPE.handle();
        String handle2 = OrderEnum.GROUP_TYPE.handle();
        String handle3 = OrderEnum.PROMOTION_TYPE.handle();

        assert handle1.equals("处理普通订单");
        assert handle2.equals("处理团购订单");
        assert handle3.equals("处理促销订单");
    }

你可能感兴趣的:(设计模式,Spring/Spring,Boot)