概述
适配器模式
概念
- 适配器模式(Adapter Pattern)是作为两个不兼容的接口之间的桥梁。这种类型的设计模式属于结构模式,它结合了两个独立接口的功能。
- 这种模式涉及到一个单一的类,该类负责加入独立的或者不兼容的接口功能。
- 它将一个系统的接口转换成另外一种形式,从而使原来不能直接调用的接口变的可以调用。
特点
- 源(Adaptee):需要被适配的对象或类型,旧版本或者是内存卡和笔记本之间的读卡器。
- 适配器(Adapter):连接目标和源的中间对象,相当于一个转换器,新旧版本可以实现兼容。
- 目标(Target):客户所期待的接口。目标可以使具体的或抽象的类,也可以是接口。
使用场景
新老版本接口的兼容。
优缺点
-
优点
- 可以让任何两个没有关联的类一起远行。
- 提高了类的复用。
- 增加了类的透明度。
- 灵活性好。
-
缺点
- 过多的使用适配器,会让系统非常零乱,不易整体把握。
模式的结构
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时:
所有关于设计模式的代码,都会托管到:设计模式代码,欢迎关注。
最后
以上就是老迟到招牌为你收集整理的设计模式(五)之适配器模式的全部内容,希望文章能够帮你解决设计模式(五)之适配器模式所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复