组合模式
组合模式用来描述树型结构,在一个树型结构中,叶子节点被称为叶子或简单项目,其他节点被称为整体项目或组合
主要由以下几种角色构成
- Client:访问者,调用组合模型的对象
- Component:组件,描述简单项目和整体项目的共有操作
- Leaf:叶子,描述一个简单项目,是最基本的结构
- Composite:组合,包含叶子或者其他组合
类图
上图所示是组合模式的类图
简单例子
公司的结构相当于一个树型结构——一个公司包含多个部门,部门之下又有许多员工或者更多的子部门,员工即是叶子,部门或公司相当于组合。
现已知这个组合,需要计算公司员工的总工资
// 相当于Component角色,部门和员工都可以单独计算工资
interface Salable {
double calSalary();
}
// 相当于Leaf角色
class Employee implements Salable {
String name;
double salary;
public double calSalary() {
return this.salary;
}
}
// 相当于Composite角色
class Department implements Salable {
Employee leader;
List<Employee> others;
public double calSalary() {
double sum = leader.salary;
if (CollectionUtils.isNotEmpty(others)) {
others.foreach(one -> sum += one.salary})
}
return sum;
}
}
SpringMVC中的组合模式
Web项目中使用@EnableWebMvc
注解后,会将DelegatingWebMvcConfiguration
对象加载进Spring容器,该容器中维护了一个名叫WebMvcConfigurerComposite
的组合,WebMvcConfigurerComposite
中维护了多个WebMvcConfigurer
对象
类图如下:
Spring在初始化DelegatingWebMvcConfiguration对象的时候,将多个自定义的WebMvcConfigurer实现类注入WebMvcConfigurerComposite中
以上DelegatingWebMvcConfiguration相当于Client角色,WebMvcConfigurer定义了多个简单项目和整体的公共操作,相当于Component角色,SpringMvcConfig是叶子,WebMvcConfigurerComposite中包含多个SpringMvcConfig,也可以包含其他WebMvcConfigurerComposite,相当于Composite角色