一、组合模式介绍

组合模式(Composite Design Pattern)。组合模式也是结构型模式,是一种对象间组合的代码模板。

不过“组合模式” 不是简单的对象之间的组合。

组合模式 用来表示对象之间的层级关系,树形关系。比如:部门间树形层级关系,或者员工的从属关系,文件目录间结构等树形结构。

宽泛来说,同种类型的事物组成的树形层级结构,就可以叫做组合。

二、组合模式案例

通过公司各部门树型关系组合,介绍组合模式。

相关代码如下:

[设计模式]-[结构型]-组合-介绍及应用 - 图1

如上述代码所示,公司为根节点,以此向下延伸部门子节点,各个部门,再向下延伸子部门,以此构成树形结构,这就是组合模式。

三、Spring 中的组合模式在 SpringMVC 中,Http 请求由 DispatcherServlet 进行处理。

DispathcerServlet 会根据不同的请求 url,选择不同的 HandlerAdapter 处理器适配器进行处理。

相关 HandlerAdapter 讨论

针对带有 @RequestMapping 及其派生注解 @PostMapping 等注解的请求 URL,会由 RequestMappingHandlerAdapter 进行处理。
一个简单案例代码如下:
[设计模式]-[结构型]-组合-介绍及应用 - 图2
上述代码中有两个关注点,一个请求入参,一个结果响应。
问题1:针对 HTTP 请求来说,整个url就是一字符串,所有的参数也是字符串,那么SpringMVC 是怎么进行类型转换然后赋值给方法参数的?
问题2:针对响应结果,比如一个对象,是如何解析成一个 JSON字符串,然后进行结果返回的?
这两个问题在处理器 RequestMappingHandlerAdapter 中能够得到解答,来看部分源码,如下:
[设计模式]-[结构型]-组合-介绍及应用 - 图3
从上图能够得出:
针对请求入参,由解析器组合 HandlerMethodArgumentResolverComposite来完成解析
针对响应结果,由解析器组合 HandlerMethodReturnValueHandlerComposite来完成解析
这两个解析器组合的实现方式都是使用的组合模式,以请求入参处理解析器 HandlerMethodArgumentResolverComposite为例,相关代码如下:
[设计模式]-[结构型]-组合-介绍及应用 - 图4

如上述代码,有一个关键接口 HandlerMethodArgumentResolver,具有请求入参类型解析功能的类都需要实现 HandlerMethodArgumentResolver
简单看一下HandlerMethodArgumentResolver 接口相关的实现类:
[设计模式]-[结构型]-组合-介绍及应用 - 图5

关注实现类,能够知道请求入参解析器组合类HandlerMethodArgumentResolverComposite也实现了 HandlerMethodArgumentResolver接口,
不同的是 HandlerMethodArgumentResolverComposite不提供解析能力,
请求入参解析器组合 HandlerMethodArgumentResolverComposite持有 HandlerMethodArgumentResolver解析器集合,其本身不提供解析能力,而是通过其持有的 解析器集合进行解析操作。
通过代码能够知道 HandlerMethodArgumentResolverComposite和其持有的解析器集合 List<HandlerMethodArgumentResolver> 组成了层级关系
相关层级结构图,如下:

[设计模式]-[结构型]-组合-介绍及应用 - 图6

一个解析器下有多个解析器,就像一个部门下有多个子部门,组成树形结构,这就是组合模式。


【公众号】花好夜猿
wxlogo.jpg