第四篇 生成对象树 第十三章 - 组合模式
接下来的两个章节为您介绍树形结构。
树形结构很常见,文件目录和系统菜单是典型的树形结构。自然界中的树形结构更多,这里“树木丛生,百草丰茂。”
我们关注的树形结构主要是“树形对象结构”,也称“对象树”,它描述了对象之间的分支和层次关系。
组合模式常被用来生成对象树。
下面模拟玉米的“茎—苞—须”三级结构,看看组合模式的写法。
// 抽象元素
public abstract class Component {
private Component parent;// 父元素
public abstract void show();
public Component getParent() {
return parent;
}
public void setParent(Component parent) {
this.parent = parent;
}
}
// 复合元素(茎、苞)
public class Composite extends Component {
// 子元素列表
java.util.List<Component> list = new java.util.ArrayList<>();
// 添加子元素
public boolean add(Component obj) {
obj.setParent(this);
return list.add(obj);
}
// 获取子元素
public java.util.List<Component> getChildren() {
return this.list;
}
@Override
public void show() {
// 苗心别出一苞。
}
}
// 末端元素(须)
public class Terminal extends Component {
@Override
public void show() {
// 苞上出白丝垂垂。
}
}
// 测试类
public class Test {
public void test() {
// 生成树形对象结构
Composite plant = new Composite();// 茎
Composite cob = new Composite();// 苞
Terminal silk1 = new Terminal();// 须
Terminal silk2 = new Terminal();// 须
plant.add(cob);
cob.add(silk1);
cob.add(silk2);
// 遍历树中对象
show(plant);
}
// 递归遍历树中对象
public void show(Composite obj) {
for (Component child : obj.getChildren()) {
if (child instanceof Terminal) {
child.show();
} else {
show((Composite) child);
}
}
}
}
这里将对象树的组成元素分成了“复合元素”和“末端元素”两种类型。
复合元素(如茎、苞)均包含下级元素,除了位于树根部的元素(如茎)外,其他复合元素都有上级元素;末端元素(如须)只有上级元素,没有下级元素。
新增对象时只需“二选一”将其定型为复合元素或末端元素,就可以方便地把它加到树中。
此例生成的对象树如图所示。

浙公网安备 33010602011771号