组合模式
组合(Composite)是指使用组合和继承关系将聚合体及其组成元素分解成树状结构,以便客户端在不需要区分聚合体或组成元素类型的情况下使用统一的接口操作它们
Spring MVC 中解析参数时使用组合模式
类图展示:
解析参数接口HandlerMethodArgumentResolver
代码:
public interface HandlerMethodArgumentResolver {
/**
* 用于判断是否可以解析传入的参数
*/
boolean supportsParameter(MethodParameter parameter);
/**
* 用于实际解析参数
*/
@Nullable
Object resolveArgument(MethodParameter parameter, @Nullable ModelAndViewContainer mavContainer,
NativeWebRequest webRequest, @Nullable WebDataBinderFactory binderFactory) throws Exception;
}
可以看出该接口定义了两个方法,一个判断是否可以解析参数,另一个就是实际解析参数的方法.
HandlerMethodArgumentResolver
接口的继承结构为:
上面继承结构看出有一个类HandlerMethodArgumentResolverComposite
比较特殊
再看组合类HandlerMethodArgumentResolverComposite
代码:
public class HandlerMethodArgumentResolverComposite implements HandlerMethodArgumentResolver {
/**参数解析器集合*/
private final List<HandlerMethodArgumentResolver> argumentResolvers = new LinkedList<>();
private final Map<MethodParameter, HandlerMethodArgumentResolver> argumentResolverCache =
new ConcurrentHashMap<>(256);
/**
* 添加解析器
*/
public HandlerMethodArgumentResolverComposite addResolver(HandlerMethodArgumentResolver resolver) {
this.argumentResolvers.add(resolver);
return this;
}
/**
* 添加多个解析器
*/
public HandlerMethodArgumentResolverComposite addResolvers(
@Nullable HandlerMethodArgumentResolver... resolvers) {
if (resolvers != null) {
Collections.addAll(this.argumentResolvers, resolvers);
}
return this;
}
/**
* 添加解析器集合
*/
public HandlerMethodArgumentResolverComposite addResolvers(
@Nullable List<? extends HandlerMethodArgumentResolver> resolvers) {
if (resolvers != null) {
this.argumentResolvers.addAll(resolvers);
}
return this;
}
/**
* 返回一个只读的HandlerMethodArgumentResolver集合,或者空集合
*/
public List<HandlerMethodArgumentResolver> getResolvers() {
return Collections.<