zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    tyvj 1031 热浪 最短路
    【bzoj2005】 [Noi2010]能量采集 数学结论(gcd)
    hdu 1394 Minimum Inversion Number 逆序数/树状数组
    HDU 1698 just a hook 线段树,区间定值,求和
    ZeptoLab Code Rush 2015 C. Om Nom and Candies 暴力
    ZeptoLab Code Rush 2015 B. Om Nom and Dark Park DFS
    ZeptoLab Code Rush 2015 A. King of Thieves 暴力
    hdoj 5199 Gunner map
    hdoj 5198 Strange Class 水题
    vijos 1659 河蟹王国 线段树区间加、区间查询最大值
  • 原文地址:https://www.cnblogs.com/jieyuefeng/p/11695986.html
Copyright © 2011-2022 走看看