陆小叁
这是一个充满鲜花的世界

时空链接:

  1. 设计模式(一)之策略模式
  2. 设计模式(二)之责任链模式
  3. 设计模式(三)之模板模式
  4. 设计模式(四)之装饰者模式
  5. 设计模式(五)之适配器模式
  • 所有关于设计模式的代码,都会托管到:设计模式代码,欢迎关注。

适配器模式

概念

  1. 适配器模式(Adapter Pattern)是作为两个不兼容的接口之间的桥梁。这种类型的设计模式属于结构模式,它结合了两个独立接口的功能。
  2. 这种模式涉及到一个单一的类,该类负责加入独立的或者不兼容的接口功能。
  3. 它将一个系统的接口转换成另外一种形式,从而使原来不能直接调用的接口变的可以调用。

特点

  • 源(Adaptee):需要被适配的对象或类型,旧版本或者是内存卡和笔记本之间的读卡器。
  • 适配器(Adapter):连接目标和源的中间对象,相当于一个转换器,新旧版本可以实现兼容。
  • 目标(Target):客户所期待的接口。目标可以使具体的或抽象的类,也可以是接口。

使用场景

新老版本接口的兼容。

优缺点

  • 优点

    1. 可以让任何两个没有关联的类一起远行。
    2. 提高了类的复用。
    3. 增加了类的透明度。
    4. 灵活性好。
  • 缺点

    1. 过多的使用适配器,会让系统非常零乱,不易整体把握。

模式的结构

SpringMvc是一个非常棒的框架,配置相对灵活,实现简单。今天我们就模拟一个有关适配器的适配过程和简单使用。

开发步骤

  • 模拟SpringMvc的DispatcherServlet对象,对请求进行派发。我们也编写一个和它一样的doService方法,如下图:

      在该方法内部,调用 doDispatch方法




      从所有的适配器对象当中挑选出唯一一个对应此请求handler的适配器




      getHandlerAdapter方法内部,调用适配器中的supports方法,判断是否支持请求handler




      大致有哪些HandlerAdapter呢?





      我们上面有见到有一个supports方法,适配器的方法是定义在一个统一的父类当中的,主要包含两个方法,supports判断是否支持对应的handler请求,

handle则是处理具体的handler请求,那让我们来看看,如下图:





      到这里也看到其实并不难实现。下面我们就开始吧。
      定义一个类似于DispatcherServlet的处理类

package com.lee.adapter.controller;

import com.lee.adapter.service.HandlerAdapter;
import com.lee.adapter.service.impl.RequestMappingHandlerAdapter;
import com.lee.adapter.service.impl.SimpleHandlerAdapter;
import com.lee.adapter.service.impl.SimpleServletHandlerAdapter;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @author zfl_a
 * @Desc 入口测试
 * @date 2020/8/16
 * @project springboot_design_pattern
 */
@RestController
public class DispatcherController implements InitializingBean {

    //自动装配
    @Autowired
    private Map<String,Controller> controllerMap = new HashMap<>();

    private List<HandlerAdapter> handlerAdapters = new ArrayList<>();

    /**
     * 处理
     * @param controllerName simpleController simpleServletController httpRequestController
     * @return
     */
    @GetMapping("/doService")
    public String doService(String controllerName){

        return doDispatcher(controllerName);
    }

    private String doDispatcher(String controllerName) {

        // 获取适配器 参数可根据具体的Handler替换
        Controller controller = controllerMap.get(controllerName);
        HandlerAdapter ha = getHandlerAdapter(controller);
        if(ha == null) {
            return "没有此适配器";
        }
        //具体处理
        return ha.handle(controller);
    }

    /**
     * 获取适配器
     * @param controller
     * @return
     */
    private HandlerAdapter getHandlerAdapter(Controller controller) {
        if (this.handlerAdapters != null) {
            for (HandlerAdapter ha : this.handlerAdapters) {
                if (ha.supports(controller)) {
                    return ha;
                }
            }
        }
        return null ;
    }

    @Override
    public void afterPropertiesSet() throws Exception {

        //初始化适配器实例
        RequestMappingHandlerAdapter mappingHandlerAdapter = new RequestMappingHandlerAdapter();
        SimpleHandlerAdapter simpleHandlerAdapter = new SimpleHandlerAdapter();
        SimpleServletHandlerAdapter servletHandlerAdapter = new SimpleServletHandlerAdapter();
        handlerAdapters.add(mappingHandlerAdapter);
        handlerAdapters.add(simpleHandlerAdapter);
        handlerAdapters.add(servletHandlerAdapter);
    }
}

  • 模拟Controller请求类

      定义一个共同的Controller,什么也不做

package com.lee.adapter.controller;

/**
 * @author zfl_a
 * @date 2020/8/16
 * @project springboot_design_pattern
 */
public interface Controller {
}

      定义对应的实现类,做具体处理的

package com.lee.adapter.controller;

import org.springframework.stereotype.Component;

/**
 * @author zfl_a
 * @date 2020/8/16
 * @project springboot_design_pattern
 */
@Component
public class HttpRequestController implements Controller {

    public String doRequestMapping(){
        return "do http request ....";
    }

}

package com.lee.adapter.controller;

import org.springframework.stereotype.Component;

/**
 * @author zfl_a
 * @date 2020/8/16
 * @project springboot_design_pattern
 */
@Component
public class SimpleController implements Controller {

    public String doSimple(){
        return "do simple ....";
    }
}

package com.lee.adapter.controller;

import org.springframework.stereotype.Component;

/**
 * @author zfl_a
 * @date 2020/8/16
 * @project springboot_design_pattern
 */
@Component
public class SimpleServletController implements Controller {

    public String doSimpleServlet(){
        return "do Simple Servlet....";
    }
}

  • 定义一个和HandlerAdapter的适配器接口
package com.lee.adapter.service;

import org.springframework.lang.Nullable;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * @author zfl_a
 * @Desc 所有适配器的父类
 * @date 2020/8/16
 * @project springboot_design_pattern
 */
public interface HandlerAdapter {

    boolean supports(Object handler);

    String handle(Object handler) ;

}

  • 定义和上面Controller对应的Adapter
package com.lee.adapter.service.impl;

import com.lee.adapter.controller.HttpRequestController;
import com.lee.adapter.service.HandlerAdapter;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.ModelAndView;

/**
 * @author zfl_a
 * @date 2020/8/16
 * @project springboot_design_pattern
 */
public class RequestMappingHandlerAdapter implements HandlerAdapter {

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

    @Override
    public String handle(Object handler)  {

        return ((HttpRequestController)handler).doRequestMapping();
    }
}

package com.lee.adapter.service.impl;

import com.lee.adapter.controller.SimpleController;
import com.lee.adapter.service.HandlerAdapter;
import org.springframework.stereotype.Component;

/**
 * @author zfl_a
 * @date 2020/8/16
 * @project springboot_design_pattern
 */
public class SimpleHandlerAdapter implements HandlerAdapter {

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

    @Override
    public String handle(Object handler)  {
        return ((SimpleController)handler).doSimple();
    }
}

package com.lee.adapter.service.impl;

import com.lee.adapter.controller.SimpleServletController;
import com.lee.adapter.service.HandlerAdapter;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.ModelAndView;

/**
 * @author zfl_a
 * @date 2020/8/16
 * @project springboot_design_pattern
 */
public class SimpleServletHandlerAdapter implements HandlerAdapter {
    @Override
    public boolean supports(Object handler) {
        return handler instanceof SimpleServletController;
    }

    @Override
    public String handle(Object handler) {

        return ((SimpleServletController)handler).doSimpleServlet();
    }
}

测试结果如下:

  • 当请求参数为 ?controllerName=simpleServletController时:

  • 当请求参数为 ?controllerName=httpRequestController时:

posted on 2020-08-16 09:34  陆小叁  阅读(318)  评论(0编辑  收藏  举报