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