一、组合模式介绍
组合模式(Composite Design Pattern)。组合模式也是结构型模式,是一种对象间组合的代码模板。
不过“组合模式” 不是简单的对象之间的组合。
组合模式 用来表示对象之间的层级关系,树形关系。比如:部门间树形层级关系,或者员工的从属关系,文件目录间结构等树形结构。
宽泛来说,同种类型的事物组成的树形层级结构,就可以叫做组合。
二、组合模式案例
通过公司各部门树型关系组合,介绍组合模式。
相关代码如下:
如上述代码所示,公司为根节点,以此向下延伸部门子节点,各个部门,再向下延伸子部门,以此构成树形结构,这就是组合模式。
三、Spring 中的组合模式在 SpringMVC 中,Http 请求由 DispatcherServlet
进行处理。
DispathcerServlet
会根据不同的请求 url,选择不同的 HandlerAdapter
处理器适配器进行处理。
针对带有 @RequestMapping
及其派生注解 @PostMapping
等注解的请求 URL,会由 RequestMappingHandlerAdapter
进行处理。
一个简单案例代码如下:
上述代码中有两个关注点,一个请求入参,一个结果响应。
问题1:针对 HTTP 请求来说,整个url就是一字符串,所有的参数也是字符串,那么SpringMVC 是怎么进行类型转换然后赋值给方法参数的?
问题2:针对响应结果,比如一个对象,是如何解析成一个 JSON字符串,然后进行结果返回的?
这两个问题在处理器 RequestMappingHandlerAdapter
中能够得到解答,来看部分源码,如下:
从上图能够得出:
针对请求入参,由解析器组合 HandlerMethodArgumentResolverComposite
来完成解析
针对响应结果,由解析器组合 HandlerMethodReturnValueHandlerComposite
来完成解析
这两个解析器组合的实现方式都是使用的组合模式,以请求入参处理解析器 HandlerMethodArgumentResolverComposite
为例,相关代码如下:
如上述代码,有一个关键接口 HandlerMethodArgumentResolver
,具有请求入参类型解析功能的类都需要实现 HandlerMethodArgumentResolver
。
简单看一下HandlerMethodArgumentResolver
接口相关的实现类:
关注实现类,能够知道请求入参解析器组合类HandlerMethodArgumentResolverComposite
也实现了 HandlerMethodArgumentResolver
接口,
不同的是 HandlerMethodArgumentResolverComposite
不提供解析能力,请求入参解析器组合 HandlerMethodArgumentResolverComposite
持有 HandlerMethodArgumentResolver
解析器集合,其本身不提供解析能力,而是通过其持有的 解析器集合进行解析操作。
通过代码能够知道 HandlerMethodArgumentResolverComposite
和其持有的解析器集合 List<HandlerMethodArgumentResolver>
组成了层级关系
相关层级结构图,如下:
一个解析器下有多个解析器,就像一个部门下有多个子部门,组成树形结构,这就是组合模式。
【公众号】花好夜猿