当前位置:   article > 正文

记录利用设计模式取代if-else的一些方法_替换if else设计模式

替换if else设计模式

1.循环判断法

         典型用例:springmvc中的handlerAdapter中

   在执行类中定义判断方法和执行方法。

  1. public interface HandlerAdapter {
  2. //判断该实现类是否能在这个对象上使用
  3. boolean support(Object handler);
  4. //执行方法
  5. Class<?> process(Object handler);
  6. }

提前注入所有的handlerAdapter类(所有的实现类需要交给spring容器保管)

  1. @Component
  2. public class HandlerAdapterContext {
  3. @Autowired
  4. private List<HandlerAdapter> handlerAdapterList; //注册所有的HandlerAdapter类
  5. public List<HandlerAdapter> getHandlerAdapterList(){
  6. return handlerAdapterList;
  7. }
  8. }

客户端:

  1. public class Client {
  2. @Autowired
  3. private HandlerAdapterContext handlerAdapterContext;
  4. @Test
  5. public void test(){
  6. Object o = new Object();
  7. for (HandlerAdapter handlerAdapter : handlerAdapterContext.getHandlerAdapterList()) {
  8. if (handlerAdapter.support(o)) {//找到适配的就执行
  9. o = handlerAdapter.process(o);
  10. }
  11. }
  12. }
  13. }

优点:扩展时只需要将新的接口实现类注入到sprin容器中即可

缺点;每次都需要遍历全部的接口类,且无法控制执行顺序

2.map获取法

        典型用例:springmvc中参数转换,将string类型的接收参数动态的转换成函数的参数类型

定义接口类:

  1. public interface ParseStringValue {
  2. Object parse(String value);
  3. }

定义实现类:

  1. public class LongParseStringValue implements ParseStringValue{
  2. @Override
  3. public Object parse(String value) {
  4. return Long.valueOf(value);
  5. }
  6. }
  1. public class IntegerParseStringValue implements ParseStringValue{
  2. @Override
  3. public Object parse(String value) {
  4. return Integer.valueOf(value);
  5. }
  6. }
  1. public class DoubleParseStringValue implements ParseStringValue{
  2. @Override
  3. public Object parse(String value) {
  4. return Double.valueOf(value);
  5. }
  6. }

提前注入实现类。如果在spring中的话可以使用@PostConstruct

  1. public class ParseStringValueContext {
  2. private static Map<Class<?>, ParseStringValue> parseStringValueMap;
  3. static {
  4. parseStringValueMap = new HashMap<>();
  5. parseStringValueMap.put(Integer.class, new IntegerParseStringValue());
  6. parseStringValueMap.put(Double.class, new DoubleParseStringValue());
  7. parseStringValueMap.put(Long.class, new LongParseStringValue());
  8. }
  9. public static ParseStringValue getResolver(Class<?> clazz){
  10. return parseStringValueMap.get(clazz);
  11. }
  12. }

使用:

  1. public class Client {
  2. private static void test(Integer num1, Long num2, Double num3) {
  3. System.out.println("num1 = " + num1);
  4. System.out.println("num2 = " + num2);
  5. System.out.println("num3 = " + num3);
  6. }
  7. public static void main(String[] args) {
  8. String[] requestParameters = new String[]{"111", "1111111111111111", "1.11"};//模拟请求参数
  9. try {
  10. Method method = Client.class.getDeclaredMethod("test", Integer.class, Long.class, Double.class);
  11. List<Object> values = new ArrayList<>();
  12. Parameter[] parameters = method.getParameters();
  13. for (int i = 0; i < parameters.length; i++) {
  14. Parameter parameter = parameters[i];
  15. //根据参数类型解析参数
  16. ParseStringValue resolver = ParseStringValueContext.getResolver(parameter.getType());
  17. Object parse = resolver.parse(requestParameters[i]);
  18. values.add(parse);
  19. }
  20. Client client = Client.class.getDeclaredConstructor().newInstance((Object[]) args);
  21. method.invoke(client, values.get(0), values.get(1), values.get(2));
  22. } catch (Exception e) {
  23. throw new RuntimeException(e);
  24. }
  25. }
  26. }

结果:

优点:可以自定义处理器的获取方式,比如用class来获取

缺点;无法控制执行顺序,扩展时需要额外修改context类

 3.责任链模式

        典型用例:springmvc中的拦截器

之前的文章中有讲:

用spring boot的@Order注解实现责任链模式

优点:可以按顺序执行处理器,扩展时只需要添加接口类即可

缺点;只能处理一个类,不同的类需要定义不同的责任链,可以考虑跟1.2结合实现动态处理。

4.利用spring上下文

        前端传过来一个对应service的名字,然后用context.getBean()函数直接获取对应的请求处理类来处理。

优点:实现简单,扩展简便

缺点;需要告诉前端每个请求的处理类名,并且注入bean的时候需要保证bean名字的唯一。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/377814
推荐阅读
相关标签
  

闽ICP备14008679号