基本概念
组合模式(Composite Pattern) 强调整体和部分的关系,将对象构成一个树状结构,表现出整体和部分的层次。组合模式使得访问单一对象和组合对象具有一致性,让客户端可以用同一种方式来处理个别和组合对象。
UML
角色分析
- Component 节点抽象 抽取所有节点共有行为
- Left 末级叶子节点 只有操作方法
- Composite 非末级节点 可以对下级节点进行维护操作
现在有一个需求管理学校->班级->同学,就可以使用组合模式进行管理其中学校和班级就是Composite节点同学就是Left节点
代码实现
// 顶级抽象节点 Component
@Data
public abstract class Component {
String name;
public Component(String name) {
this.name = name;
}
void add(Component component) {
throw new UnsupportedOperationException();
}
void remove(Component component) {
throw new UnsupportedOperationException();
}
List<Component> children() {
throw new UnsupportedOperationException();
}
// 通用方法
abstract void print();
}
// Composite 非末级节点
public class School extends Component {
// 下级元素
List<Component> classes = new ArrayList<>();
public School(String name) {
super(name);
}
@Override
public void add(Component component) {
classes.add(component);
}
@Override
public void remove(Component component) {
classes.remove(component);
}
@Override
public List<Component> children() {
return classes;
}
@Override
void print() {
System.out.println("--------------" + getName() + "--------------");
//遍历 organizationComponents
for (Component c : classes) {
c.print();
}
}
}
// Composite 非末级节点 班级
public class Classes extends Component {
List<Component> classmates = new ArrayList<>();
public Classes(String name) {
super(name);
}
@Override
public void add(Component component) {
classmates.add(component);
}
@Override
public void remove(Component component) {
classmates.remove(component);
}
@Override
public List<Component> children() {
return classmates;
}
@Override
void print() {
System.out.println("--------------" + getName() + "--------------");
//遍历 organizationComponents
for (Component c : classmates) {
c.print();
}
}
}
// Left节点叶子节点 没有关于Add和remove 的操作
public class Classmate extends Component {
public Classmate(String name) {
super(name);
}
@Override
void print() {
System.out.println("同学" + this.name);
}
}
使用细节
- 简化用户操作,客户端对对象的调用一致屏蔽整合和部分的区别
- 拓展性强修改组合对象只需要调整层次,客户端无修改
- 适合树状结构的数据,如果各节点的差异较大不适合用组合模式