- 概述 组合模式是一种用于处理树形结构的设计模式,它允许将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。
- 主要角色 Component(组件):定义了树中每个节点的行为,既可以是叶子节点,也可以是组合节点。 Leaf(叶子节点):表示树中的叶节点,没有子节点。 Composite(组合节点):表示树中的分支节点,可以有多个子节点,通常包含一个集合来管理这些子节点。 Client(客户端):通过统一的接口与组合结构中的对象进行交互。
- 实现步骤 定义一个抽象的 Component 类或接口,声明所有子类共有的方法。 实现 Leaf 类,继承自 Component,实现具体的功能。 实现 Composite 类,继承自 Component,管理子节点的添加、删除和遍历操作。 客户端通过 Component 接口与组合结构中的对象进行交互。
- 示例代码 4.1 定义组件接口
public interface Component {
void add(Component component);
void remove(Component component);
Component getChild(int index);
void operation();
}
4.2 实现叶子节点
public class Leaf implements Component {
private String name;
public Leaf(String name) {
this.name = name;
}
@Override
public void add(Component component) {
throw new UnsupportedOperationException("Leaf does not support add operation");
}
@Override
public void remove(Component component) {
throw new UnsupportedOperationException("Leaf does not support remove operation");
}
@Override
public Component getChild(int index) {
throw new UnsupportedOperationException("Leaf does not support getChild operation");
}
@Override
public void operation() {
System.out.println("Leaf " + name + " operation");
}
}
4.3 实现组合节点
import java.util.ArrayList;
import java.util.List;
public class Composite implements Component {
private String name;
private List<Component> children = new ArrayList<>();
public Composite(String name) {
this.name = name;
}
@Override
public void add(Component component) {
children.add(component);
}
@Override
public void remove(Component component) {
children.remove(component);
}
@Override
public Component getChild(int index) {
return children.get(index);
}
@Override
public void operation() {
System.out.println("Composite " + name + " operation");
for (Component child : children) {
child.operation();
}
}
}
4.4 客户端代码
public class Client {
public static void main(String[] args) {
// 创建组合节点
Composite root = new Composite("root");
Composite branch1 = new Composite("branch1");
Composite branch2 = new Composite("branch2");
// 创建叶子节点
Leaf leaf1 = new Leaf("leaf1");
Leaf leaf2 = new Leaf("leaf2");
Leaf leaf3 = new Leaf("leaf3");
// 构建树形结构
root.add(branch1);
root.add(branch2);
branch1.add(leaf1);
branch1.add(leaf2);
branch2.add(leaf3);
// 执行操作
root.operation();
}
}
- 运行结果
Composite root operation
Composite branch1 operation
Leaf leaf1 operation
Leaf leaf2 operation
Composite branch2 operation
Leaf leaf3 operation
- 总结 组合模式通过将对象组织成树形结构,使得客户端可以一致地处理单个对象和组合对象。这种模式在处理具有层次结构的数据时非常有用,如文件系统、图形界面组件等。通过组合模式,可以简化客户端代码,提高系统的灵活性和可扩展性。