废话写在前面吧(应届生或在校生看):
当还是应届生的时候,找到好工作的机会是远大于后面的。所以现在毕业季,各位应届生,多去向上尝试。如果你已经在一家公司实习,你有更好的机会,就不要觉得不好意思,也不要被领导的饼唬到,到你手上的才是真实的。
正文:
适配器模式是一种结构性设计模式,它使接口不兼容的类能够一起工作。通过适配器模式,客户端可以利用一个已有的类,即使他的接口与客户端所期望的接口不兼容。
核心逻辑:
通过适配器(继承或组合)将不兼容的接口转换为使用者所期望的接口
优缺点:
优点:
复用性:已有的类通过适配器再新的方法中继续使用
扩展性:通过适配器,能够实现接口组合完成工作
独立性:调用调用适配器,不必关系内部实现
缺点:
复杂性可能上升,可读性可能下降
代码举例:
1.首先来定义一个需要被适配的接口:
public interface Controller {
ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception;
}
2.定义一个适配器接口:
public interface HandlerAdapter {
/**
* 用于判断适配器是否支持给定的处理器
* @param handler 处理器
* @return
*/
boolean supports(Object handler);
/**
* 当上面的校验通过能够处理,就使用该方法:用于处理请求
* @param request
* @param response
* @param handler
* @return
* @throws Exception
*/
ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception;
/**
* 这里拿到的时候请求最后的处理时间时间戳
* @param request
* @param handler
* @return
*/
long getLastModified(HttpServletRequest request, Object handler);
}
3.实现:
public class SimpleControllerHandlerAdapter implements HandlerAdapter{
@Override
public boolean supports(Object handler) {
return (handler instanceof Controller);
}
/**
* 在执行该方法的时候,就已经经过校验了,handler是一个实现了controller的处理器,所有的实现都会重写handleRequest,也就是具体的执行逻辑
* @param request
* @param response
* @param handler
* @return
* @throws Exception
*/
@Override
public ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
return ((Controller) handler).handleRequest(request, response);
}
@Override
public long getLastModified(HttpServletRequest request, Object handler) {
return -1;
}
}
4.最后的调用:
public class DispatcherServlet extends FrameworkServlet {
protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
HandlerAdapter ha = getHandlerAdapter(handler);
ha.handle(request, response, handler);
}
protected HandlerAdapter getHandlerAdapter(Object handler) {
for (HandlerAdapter ha : this.handlerAdapters) {
if (ha.supports(handler)) {
return ha;
}
}
throw new ServletException("No adapter for handler");
}
}
这儿实际需要调用的实现contoller的某个类,但是在这儿,通过适配器类,我们无需关心具体的controller的实现,直接调用适配器实现类当中的handler即可
到这,我们再来来一个经典的面试题:请简述一下springMVC的执行流程:
1.请求进来被dispatcherServlet拦截,dispatcherServlet将请求给HandlerMapping
2.HandlerMapping根据url去找handler,并返回一个HandlerExecutionChain
3.dispatcherServlet根据获取的HandlerExecutionChain去找到一个合适的HandlerAdapter
4.执行handle方法并返回一个modelAndView
5.请求视图解析器解析并返回一个View
6.渲染视图、响应用户
如上就是一个极度简化的答案。
dispatcherServlet?HandlerMapping?handler?modelAndView?如果看了上面的代码,是不是就觉得很熟悉?
没错。上面的代码示例,就是来自于springmvc当中,大致就是上面的第3、4步当中的步骤。当然,具体的实现会更加复杂,毕竟这里主要为了介绍适配器模式!
最后:其实本来想把本文结合springMVC讲的更加细致一点,但是最近在公司遭遇了一些非常非常非常恶心的事情,所以直接从以前的文稿里面复制粘贴就发了。
有时间我会再改一版的~
标签:return,适配器,request,param,handler,速学,设计模式,response From: https://blog.csdn.net/weixin_45649643/article/details/139836523