设计模拟之适配器模式

本文详细介绍了适配器模式的概念和分类,包括类适配器和对象适配器。重点阐述了Spring MVC中的HandlerAdapter如何作为对象适配器工作,通过遍历适配器集合并根据支持的处理程序选择合适的适配器来处理HTTP请求。适配器模式在这里降低了代码的耦合度,增强了系统的灵活性。
摘要由CSDN通过智能技术生成

适配器模式

  • 涉及模式意义:将两个不相关的功能进行结合;例如在一个接口里面使用与它完全无关另外一个类的方法
  • 分类
    • 类适配器:当客户在接口中定义了他期望的行为时,我们就可以应用适配器模式,提供一个实现该接口的类,并且扩展已有的类,通过创建子类来实现适配。
    • 对象适配器:对象适配器”通过组合除了满足“用户期待接口”还降低了代码间的不良耦合。在工作中推荐使用“对象适配”。
  • 常用方式:将多个适配器封装到一个集合里面,然后遍历适配器集合,通过调用适配器集合方法判断使用哪一个适配器,然后调用具体适配器方法,通过适配器调用具体想要使用的方法;
  • 经典案例
    • springMVC中的HandlerAdapter
public interface HandlerAdapter {
   boolean supports(Object var1);

   @Nullable
   ModelAndView handle(HttpServletRequest var1, HttpServletResponse var2, Object var3) throws Exception;

   long getLastModified(HttpServletRequest var1, Object var2);
}

// 适配器具体实现1
public class HttpRequestHandlerAdapter implements HandlerAdapter {
   public HttpRequestHandlerAdapter() {
   }
   // 判断是否使用该适配器
   public boolean supports(Object handler) {
       return handler instanceof HttpRequestHandler;
   }

   // 具体使用逻辑,里面调用具体的方法
   @Nullable
   public ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
       ((HttpRequestHandler)handler).handleRequest(request, response);
       return null;
   }

   public long getLastModified(HttpServletRequest request, Object handler) {
       return handler instanceof LastModified ? ((LastModified)handler).getLastModified(request) : -1L;
   }
}

// 调用适配器逻辑
public class DispatcherServlet extends FrameworkServlet {
   private List<HandlerAdapter> handlerAdapters;
   
   //初始化handlerAdapters
   private void initHandlerAdapters(ApplicationContext context) {
       //..省略...
   }
   
   // 遍历所有的 HandlerAdapters,通过 supports 判断找到匹配的适配器
   protected HandlerAdapter getHandlerAdapter(Object handler) throws ServletException {
   	for (HandlerAdapter ha : this.handlerAdapters) {
   		if (logger.isTraceEnabled()) {
   			logger.trace("Testing handler adapter [" + ha + "]");
   		}
   		if (ha.supports(handler)) {
   			return ha;
   		}
   	}
   }
   
   // 分发请求,请求需要找到匹配的适配器来处理
   protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
   	HttpServletRequest processedRequest = request;
   	HandlerExecutionChain mappedHandler = null;

   	// Determine handler for the current request.
   	mappedHandler = getHandler(processedRequest);
   		
   	// 确定当前请求的匹配的适配器.
   	HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());

   	ha.getLastModified(request, mappedHandler.getHandler());
   				
   	mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
   }
   // ...省略...
}	
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值