首页 > 其他 > 详细

适配器模式

时间:2020-03-04 12:00:05      阅读:63      评论:0      收藏:0      [点我收藏+]


在学习SpringMVC的过程中,看到了适配器模式,然后就记下了,回来填坑


1. 适配器模式(Adapter Pattern)

将一个接口转换成客户希望的另一个接口,使不兼容的类可一起工作,其组成可分为:


  • Target:客户所需要的接口
  • Adapter:适配器
  • Adaptee:被适配者








2. 流程


2.1 Adaptee

public class Adaptee {
    
    public void adapteeMethod(){
        System.out.println("被适配者的方法执行了");
    }
}


2.2 Target

public interface Target {

    public void targetMethod();
}


2.3 Adapter

public class Adapter implements Target {
    
    private Adaptee adaptee;
    
    public Adapter(Adaptee adaptee){
        this.adaptee = adaptee;
    }

    @Override
    public void targetMethod() {
        adaptee.adapteeMethod();
    }
}


2.4 测试

public class test {
    
    public static void main(String[] args) {
        
        // 创建被适配者
        Adaptee adaptee = new Adaptee();
        
        // 创建适配器
        Adapter adapter = new Adapter(adaptee);
        
        adapter.targetMethod();
    }
}








3. SpringMVC中的应用

先放一张请求流程图,其中涉及到了映射器和适配器以及处理器


技术分享图片

网图,侵删


用户发送请求,然后DispatcherServlet通过HandlerMapping映射出对应的Handler以及相关的Interceptors,将这二者绑定到HandlerExecutionChain并返回


由于Handler有很多种类,调用方法也参次不齐,如果将其传进给DispatcherServlet,那么调用方法的时候则需用if(paramHandler instanceof XXXHandler)这样判断,再调用该Handler的方法,如果Handler种类再继续增加,则需要在DispatcherServlet增加判断,违反开闭原则(对修改关闭,对扩展开放),那么适配器模式就出场了


Spring提供一个适配器模式中的Target接口,那么只要实现了Adapter就可以适配一种Handler,不用在DispatcherServlet里进行判断了。DispatcherServlet内部通过HandlerMapping获取对应的Handler,然后通过Handler来获取HandlerAdapter,最后调用HandlerAdapter的handler方法即可实现处理器功能。此时如果增加一种Handler,则只要增多一个HandlerAdapter实现类即可


这里Handler是广义的,包括我们常说的Controller、Servlet、HttpRequestHandler




Target接口

public interface HandlerAdapter {
 
    // 判断是否支持该Handler
    boolean supports(Object handler);
    
    // 适配Handler,并使Handler执行
    ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception;

}


DispatcherServlet中的doDispatch方法

为了聚集关注点只列出了相关的源码


protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
        
        try {
            
            // 变量提升
            ModelAndView mv = null;
            Exception dispatchException = null;
 
            try {
                
                // 处理请求
                processedRequest = checkMultipart(request);
                multipartRequestParsed = (processedRequest != request);
 
                // 通过HandlerMapping来获取映射出的Handler
                mappedHandler = getHandler(processedRequest);
                if (mappedHandler == null || mappedHandler.getHandler() == null) {
                    noHandlerFound(processedRequest, response);
                    return;
                }
 
                // 调用HandlerAdapter的handle方法并返回ModelAndView,适配器模式中的对象适配
                mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
 
                // 返回ModelAndView
                applyDefaultViewName(processedRequest, mv);
                mappedHandler.applyPostHandle(processedRequest, response, mv);
            }
            catch (Exception e) {
                XXXXX
            }finally {
                XXXXX
            }
        }catch (Exception e) {
            XXXXX
        }
}




适配器模式

原文:https://www.cnblogs.com/Howlet/p/12408387.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!