• HandlerAdapter与适配器模式以及SpringMVC核心接口


    HandlerAdapter,顾名思义,是Handler的适配器,为了适配各种Handler,从而可以以统一的方式获取ModelAndView。

    // request => Handler
    public interface HandlerMapping {
        HandlerExecutionChain getHandler(HttpServletRequest request);
    }
    
    //常用:
    // - BeanNameUrlHandlerMapping
    // - RequestMappingHandlerMapping
    
    // Handler => ModelAndView
    public interface HandlerAdapter {
        boolean support(Object handler);
        ModelAndView handler(HttpServletRequest request, HttpServletResponse response, Object handler);
        long getLastModified(HttpServletRequest request, Object handler);
    }
    
    //常用:
    // - HttpRequestHandlerAdapter
    // - SimpleControllerHandlerAdapter
    // - RequestMappingHandlerAdapter
    
    // viewName => View
    public interface ViewResolver {
        View resolveViewName(String viewName, Locale locale);
    }
    //常用:
    // - InternalResourceViewResolver
    // - FreeMarkerViewResolver
    // - ThymeleafViewResolver
    
    // 渲染
    public interface View {
        void render(Map<String, ?> model, HttpServletRequest request, HttpServletResponse response);
    }
    
    //常用:
    // - InternalResourceView
    // - FreeMarkerView
    // - ThymeleafView
    

    这段话说的很好:

    springmvc通过HandlerMapping获取到可以处理的handler,这些handler的类型各不相同,对请求的预处理,参数获取都不相同,最简单的做法是根据不同的handler类型,做一个分支处理,不同的handler编写不同的代码。

    这样的问题是很明显的,分支判断复杂,代码庞大,不符合单一职责原则。如果要增加一种handler类型,需要修改代码增加分支处理,违反了开闭原则。DispatcherServelt与多个handler发生了交互,违反迪米特法则。

    而使用适配器模式,就可以很好的解决这个问题:

    不直接对handler进行处理,而是将handler交给适配器HandlerAdapter去处理,这样DispatcherServlet交互的类就只剩下一个接口,HandlerAdapter,符合迪米特法则,尽可能少的与其他类发生交互;

    将handler交给HandlerAdapter处理后,不同类型的handler被对应类型的HandlerAdapter处理,每个HandlerAdapter都只完成单一的handler处理,符合单一职责原则;

    如果需要新增一个类型的handler,只需要新增对应类型的HandlerAdapter就可以处理,无需修改原有代码,符合开闭原则。

    这样,不同的handler的不同处理方式,就在HandlerAdapter中得到了适配,对于DispatcherServlet来讲,只需要统一的调用HandlerAdapter的handle()方法就可以了,无需关注不同handler的处理细节。

    设计模式的原则
    1.单一职责原则
    一个类只完成单一的功能,粒度越小越好

    2.开闭原则
    对扩展开放,对修改关闭。
    一个类开发完成后,应当可以通过扩展的方式实现新的功能,而不是通过修改原有类来达到目的。

    3.里氏替换原则
    所有引用父类的地方都可以透明的使用其子类

    4.依赖倒置原则
    抽象不应该依赖于细节,细节应该依赖于抽象。
    应该针对接口或抽象类编程,而不是针对具体的实现编程

    5.接口隔离原则
    接口的划分应该更细致,使用多个功能单一的接口,而不是将所有的功能放到一个接口中实现,客户端不应该去依赖它所不需要的接口方法。

    6.迪米特法则
    一个类应尽可能少的与其他类进行交互。降低耦合。

    参考链接:http://blog.sina.com.cn/s/blog_e660c25b01030kbj.html

  • 相关阅读:
    事件溯源的使用实例
    CQRS With Axon
    maven打包带依赖
    MongoDB Query语法和工具
    docker 在外部指定参数变量 spring
    logger 过滤部分类的logger
    Nginx ServerName指令
    Nginx 处理Http请求简单流程
    Listen 指令
    Nginx 配置
  • 原文地址:https://www.cnblogs.com/jieyuefeng/p/11695986.html
Copyright © 2020-2023  润新知