之前看过很多用策略模式
代替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;
}
什么是策略模式
策略模式是一种常见的设计模式,应用比较简单,官方定义是:定义一组算法,将每个算法都封装起来,并且使他们之间互相转换。策略模式的核心就是面向对象的继承和多态机制。之前写过一篇策略模式的文章,不太了解策略模式的小伙伴可以先去看看,然后再回来看下文。
枚举策略模式实现处理订单
- 策略模式通用类图
- 定义一个策略枚举类
@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("处理促销订单");
}