zoukankan      html  css  js  c++  java
  • 设计模式(五)之适配器模式

    时空链接:

    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时:

    充满鲜花的世界到底在哪里
  • 相关阅读:
    Oracle 10G R2 RAC 日常管理
    Oracle RMAN 的 show,list,crosscheck,delete命令整理
    drop table 报错ora 全分析
    Oracle RAC 日常基本维护命令
    修改RAC VIP IP
    ASM 管理命令和操作笔记
    用示例说明BitMap索引的效率要优于BTree索引
    用示例说明全文索引的性能优势
    通过append hint来插入数据,演示它和普通插入数据的性能比较。
    用示例说明BTree索引性能优于BitMap索引
  • 原文地址:https://www.cnblogs.com/aliases/p/13511553.html
Copyright © 2011-2022 走看看