目录

  • 一、适配器模式在SpringMVC框架应用的源码剖析
  • 二、模拟适配器的应用
  • 三种处理器
  • 适配器接口
  • 适配器对于三种不同处理器的适配
  • CustomDispatchServlet测试
  • 三、分析适配器
  • 3.1、概念
  • 3.2、适用场景
  • 优缺点

一、适配器模式在SpringMVC框架应用的源码剖析

1、SpringMVC中的HandlerAdapter使用了适配器模式;
2、使用HandlerAdapter的原因分析

在SpringMVC可以看到处理器的类型不同,处理请求的方式也不同,有多重实现方式,那么调用方式就不是确定的,如果需要直接调用controller方法,需要调用的时候就得不断使用ifelse来进行判断是哪一种子类然后执行。那么如果后面要扩展controller,就得修改原来的代码,违背了开闭原则。

3、SpringMVC通过适配器模式获取对应的controller步骤
Spring定义了一个适配接口,使得每一种controller有一种对应的适配器实现类;适配器代替controller执行相应的方法,扩展controller时,只需要增加一个适配器类就完成了SpringMVC的扩展;

java适配器类 适配器模式 spring_ide

二、模拟适配器的应用

三种处理器

public class AnnotationHandler {
    private static final Logger logger = LoggerFactory.getLogger(AnnotationHandler.class);
    public void doAnnotationHandle(){
        logger.info("处理Annotation请求");
    }
}
public class HttpHandler {
    private static final Logger logger = LoggerFactory.getLogger(HttpHandler.class);
    public void doHandle(){
        logger.info("处理http请求");
    }
}
public class SimpleHandler {
    private static final Logger logger = LoggerFactory.getLogger(SimpleHandler.class);
    public void doSimpleHandle(){
        logger.info("处理simple请求");
    }
}

适配器接口

public interface HandlerAdapter {
    boolean supports(Object handler);
    void handle(Object handler);
}

适配器对于三种不同处理器的适配

public class AnnotationAdapter implements HandlerAdapter {

    @Override
    public boolean supports(Object handler) {
        return handler instanceof AnnotationHandler;
    }

    @Override
    public void handle(Object handler) {
        AnnotationHandler annotationController = (AnnotationHandler) handler;
        annotationController.doAnnotationHandle();
    }
}
public class HttpAdapter implements HandlerAdapter {

    @Override
    public boolean supports(Object handler) {
        return handler instanceof HttpHandler;
    }

    @Override
    public void handle(Object handler) {
        HttpHandler httpController  = (HttpHandler) handler;
        httpController.doHandle();
    }
}
public class SimpleAdapter implements HandlerAdapter {

    @Override
    public boolean supports(Object handler) {
        return handler instanceof SimpleHandler;
    }

    @Override
    public void handle(Object handler) {
        SimpleHandler simpleController = (SimpleHandler) handler;
        simpleController.doSimpleHandle();
    }
}

CustomDispatchServlet测试

public class CustomDispatchServlet {
    private final List<HandlerAdapter> handlerList = new ArrayList<>(10);

    public CustomDispatchServlet() {
        handlerList.add(new AnnotationAdapter());
        handlerList.add(new HttpAdapter());
        handlerList.add(new SimpleAdapter());
    }

    public void doDispatch(){
        HttpHandler httpController = new HttpHandler();
        HandlerAdapter handler = getHandler(httpController);
        handler.handle(httpController);
    }

    public HandlerAdapter getHandler(Object handler) {
        for (HandlerAdapter currentHanler : handlerList) {
            if (currentHanler.supports(handler)) {
                return currentHanler;
            }
        }
        return null;
    }

    public static void main(String[] args) {
        CustomDispatchServlet customDispatchServlet = new CustomDispatchServlet();
        customDispatchServlet.doDispatch();
    }

}

打印效果:

11:49:55.292 [main] INFO com.guang.javadesign.adapter.handler.HttpController - 处理http请求

三、分析适配器

3.1、概念

Adapter适配器模式,将一个类的接口转换成客户希望的另外一个接口。使原本由于接口不兼容而不能一起工作的那些类可以一起工作了。

3.2、适用场景

1、已经存在的类的方法和需求不匹配(方法结果相同或类似)的情况。

2、适配器模式不是软件初始阶段考虑的设计模式,是随着软件的发展,由于不同产品、不同厂家造成功能类似而接口不同的问题的解决方案。

优缺点

1、优点

  • 可以让任何两个没有关联的类一起运行;
  • 增加了类的透明性;
  • 提高了类的复用度;
  • 灵活性非常好;

2、缺点

  • 过多使用适配器会使系统非常凌乱;
  • 由于java是单继承的,所以只能适配一个适配器类,而且目标类必须是抽象的;
  • 只有碰到无法改变原有设计和代码的情况下,才会考虑适配器模式;

从理论中来,到实践中去,最终回归理论