前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >适配器模式

适配器模式

作者头像
晚上没宵夜
发布2020-03-10 14:40:21
5320
发布2020-03-10 14:40:21
举报

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

1. 适配器模式(Adapter Pattern)

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

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

2. 流程

2.1 Adaptee

代码语言:javascript
复制
public class Adaptee {
    
    public void adapteeMethod(){
        System.out.println("被适配者的方法执行了");
    }
}

2.2 Target

代码语言:javascript
复制
public interface Target {

    public void targetMethod();
}

2.3 Adapter

代码语言:javascript
复制
public class Adapter implements Target {
    
    private Adaptee adaptee;
    
    public Adapter(Adaptee adaptee){
        this.adaptee = adaptee;
    }

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

2.4 测试

代码语言:javascript
复制
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接口

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

}

DispatcherServlet中的doDispatch方法

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

代码语言:javascript
复制
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
        }
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-03-04 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 适配器模式(Adapter Pattern)
  • 2. 流程
    • 2.1 Adaptee
      • 2.2 Target
        • 2.3 Adapter
          • 2.4 测试
          • 3. SpringMVC中的应用
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档