针对多类型,逻辑处理,用if else 代码可读性,拓展性都比较差,可以使用策略模式处理,对不同类型单独做逻辑处理,下面是代码实现
1.先定义一个公共接口–抽象策略
public interface HandleStrategy {
/**
* 定义选择的key类型
*
*/
String getKey();
/**
* 处理方法
* @param parameter 请求参数
*/
void handleMethod(String parameter);
}
2.创建实现类,实现公共接口–具体策略(需要加上@Component,将处理方法注册到spring容器中)
@Component
public class OneHandleService implements HandleStrategy {
//可以用枚举替代
private final String key = "1";
@Override
public String getKey() {
return key;
}
@Override
public void handleMethod(String parameter) {
System.out.println("OneHandleService:" + parameter);
}
}
@Component
public class TwoHandleService implements HandleStrategy {
//可以用枚举替代
private final String key = "2";
@Override
public String getKey() {
return key;
}
@Override
public void handleMethod(String parameter) {
System.out.println("TwoHandleService:" + parameter);
}
}
3.创建策略容器类,获取所有策略用map收集,对不同策略进行调用
@Component
public class HandleContext implements ApplicationContextAware {
private ConcurrentHashMap<String, HandleStrategy> HandleStrategyMap = new ConcurrentHashMap<>();
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
// 获取HandleStrategy的所有bean对象
Map<String, HandleStrategy> beansOfType = applicationContext.getBeansOfType(HandleStrategy.class);
beansOfType.values().stream().forEach(item -> {
HandleStrategyMap.put(item.getKey(), item);
});
}
/**
* 根据map值获取对象的HandleStrategy对象,然后调用HandleStrategy对象的处理方法
*
* @param key
* @param parameter
*/
public void resolve(String key, String parameter) {
HandleStrategy handleData = HandleStrategyMap.get(key);
handleData.handleMethod(parameter);
}
}
执行测试结果:
@Test
public void testHandle(){
HandleContext.resolve("2","2");
//输出
//TwoHandleService:2
}