首页 > 其他分享 >速学设计模式 - 适配器模式

速学设计模式 - 适配器模式

时间:2024-06-20 17:00:38浏览次数:14  
标签:return 适配器 request param handler 速学 设计模式 response

废话写在前面吧(应届生或在校生看):

当还是应届生的时候,找到好工作的机会是远大于后面的。所以现在毕业季,各位应届生,多去向上尝试。如果你已经在一家公司实习,你有更好的机会,就不要觉得不好意思,也不要被领导的饼唬到,到你手上的才是真实的。

正文:

适配器模式是一种结构性设计模式,它使接口不兼容的类能够一起工作。通过适配器模式,客户端可以利用一个已有的类,即使他的接口与客户端所期望的接口不兼容。

核心逻辑:

通过适配器(继承或组合)将不兼容的接口转换为使用者所期望的接口

优缺点:

优点:

        复用性:已有的类通过适配器再新的方法中继续使用

        扩展性:通过适配器,能够实现接口组合完成工作

        独立性:调用调用适配器,不必关系内部实现

缺点:

        复杂性可能上升,可读性可能下降

代码举例:

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

相关文章

  • 23种设计模式之享元模式
    享元模式1、定义享元模式:运用共享技术有效的支持大量细粒度对象的复用2、享元模式结构Flyweight(抽象享元类):通常是一个接口或抽象类,在抽象享元类中声明了具体享元类公共的方法,这些方法可以向外界提供享元对象的内部数据(状态),同时也可以通过这些方法来设置外部数据(状态)Conc......
  • 多线程设计模式之Future模式
    在JDK中实现线程同步等待闭环(FutureTask/Future)中已经涉及到了Future模式,相对与多线程设计模式之WorkerThread模式有何异同呢?在多线程设计模式之WorkerThread模式中client和worker之间没有任何直接联系,即worker执行的结果client是不关心的;Future模式与之的差别就在于此线......
  • 赶紧收藏!2024 年最常见 20道设计模式面试题(七)
    上一篇地址:赶紧收藏!2024年最常见20道设计模式面试题(六)-CSDN博客十三、享元模式如何优化资源使用?享元模式(FlyweightPattern)是一种结构型设计模式,用于减少创建对象的数量,以减少内存占用和提高性能。这种模式通过共享多于一个对象共同使用的相同状态,来优化资源使用。享元模......
  • 设计模式之-组合模式
    组合模式是一种结构型设计模式,用于将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式使得客户端可以统一地处理单个对象和对象组合,无需区分它们的差异。组合模式主要解决的问题是当我们需要处理对象的层次结构,并希望能够以统一的方式对待单个对象和对象组合时。它使......
  • java设计模式-抽象工厂模式
    抽象工厂模式是一种创建一系列相关或相互依赖对象的设计模式。它通过定义一个抽象工厂接口,该接口声明了一组用于创建不同类型对象的方法,具体的工厂类实现这个接口并负责创建具体的对象。抽象工厂模式属于创建型模式的一种,可以帮助我们创建一族相关的对象。抽象工厂模式主要解决的......
  • 持续总结中!2024年面试必问 20 道设计模式面试题(六)
    上一篇地址:持续总结中!2024年面试必问20道设计模式面试题(五)-CSDN博客十一、迭代器模式(IteratorPattern)解决了什么问题?迭代器模式(IteratorPattern)解决了如何顺序访问一个聚合对象中的各个元素,而不暴露其内部的表示的问题。这种模式定义了一种方法来遍历集合,同时保持了对象......
  • 设计模式-利用状态机实现订单状态流转控制
    状态机是状态模式的一种应用,相当于上下文角色的一个升级版。在工作流和游戏中有大量使用。如各种工作流引擎,几乎是状态机的子集和实现,封装状态的变化规则。Spring也给我们提供了一个很好的解决方案。在spring中的组件名称就叫StateMachine。状态机简化状态控制的开发过程,让状态机......
  • 设计模式-命令模式
    命令模式命令模式是对命令的封装,每一个命令都是一个操作:请求的一方发出请求要求执行一个操作;接收的一方收到请求,并执行操作。命令模式解耦了请求方与接收方,请求方只需要请求执行命令,不用关心命令时怎样被接收,怎样被操作以及是否被执行等。命令模式属于行为型模式。角色:接收者......
  • 设计模式-状态模式
    状态模式状态模式也成为状态机模式,是允许对象在内部状态发生改变时改变它的行为。对象看起来好像改变了它的类,属于行为型模式。角色:上下文角色(Context):定义客户端需要的接口,内部维护一个当前状态实例,并负责具体状态的切换。抽象状态角色(State):定义该状态下的行为,可以有一个或多......
  • 设计模式-迭代器模式
    迭代器模式迭代器模式,又称为游标模式,它提供一种顺序访问集合/容器对象元素的方法,而又无需暴漏集合内部表示。迭代器模式可以为不同的容器提供一致的遍历行为,而不用关心容器内容元素组成结构,属于行为型模式。角色:抽象迭代器Iterator:负责定义访问和遍历元素的接口具体迭代器Con......