策略模式用途
- 可替换掉if/else 或 switch 这种繁杂的编码方式
- 代码扩展性好,易维护
编码实现
1.定义业务类型
public enum TypeEnum {
A("a","a类型"),
B("b","b类型"),
;
private String code;
private String desc;
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public String getDesc() {
return desc;
}
public void setDesc(String desc) {
this.desc = desc;
}
TypeEnum(String code, String desc) {
this.code = code;
this.desc = desc;
}
}
2.定义策略基类
public interface IStrategy {
boolean checkValid(TypeEnum typeEnum);
List<?> doSomething(String params,TypeEnum typeEnum);
}
3.定义一个策略处理器类
@Component
public class StrategyHolder implements ApplicationContextAware {
@Autowired
private Collection<IStrategy> strategies;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
strategies = applicationContext.getBeansOfType(IStrategy.class).values();
}
public IStrategy getStrategy(TypeEnum typeEnum) {
for (IStrategy strategy : strategies) {
if (strategy.checkValid(typeEnum)) {
return strategy;
}
}
return null;
}
}
4.定义两个策略实现类
@Component
public class BStrategy implements IStrategy {
@Override
public boolean checkValid(TypeEnum typeEnum) {
return TypeEnum.B.equals(typeEnum);
}
@Override
public List<?> doSomething(String params, TypeEnum typeEnum) {
List<Integer> list = new ArrayList<>();
list.add(1);
return list;
}
}
@Component
public class AStrategy implements IStrategy {
@Override
public boolean checkValid(TypeEnum typeEnum) {
return TypeEnum.A.equals(typeEnum);
}
@Override
public List<?> doSomething(String params, TypeEnum typeEnum) {
List<String> list = new ArrayList<>();
list.add("A");
return list;
}
}
5.测试调用方式
@Autowired
private StrategyHolder strategyHolder;
@Test
public void testStra() {
TypeEnum typeEnum = TypeEnum.A;
IStrategy strategy = strategyHolder.getStrategy(typeEnum);
List<?> b = strategy.doSomething("随意", typeEnum);
System.out.println(b);
}