概念:将对象组合成树形结构以表示"部分------整体"的层次结构,使得用户对单个对象和组合对象的使用具有一致性。
组合模式有三个角色:
- 抽象构件:定义公有属性和方法。
- 叶子结点:树形结构的底层结点,没有子结点,实现抽象构件的所有操作。
- 中间结点:叶子结点之前的结点,有子结点。
组合模式最经典的例子就是文件和文件夹结构。下面用一个这样的例子来帮助大家理解组合模式。
java
public abstract class FileComponent {
protected String name;
public FileComponent(String name) {
this.name = name;
}
public abstract void add(FileComponent component);
public abstract void remove(FileComponent component);
public abstract void display(int depth);
public String getName() {
return name;
}
}
public class FileNode extends FileComponent {
public FileNode(String name) {
super(name);
}
@Override
public void add(FileComponent component) {
throw new UnsupportedOperationException("Cannot add components to a file.");
}
@Override
public void remove(FileComponent component) {
throw new UnsupportedOperationException("Cannot remove components from a file.");
}
@Override
public void display(int depth) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < depth; i++) {
sb.append("--");
}
System.out.println(sb + name);
}
}
public class Directory extends FileComponent {
private List<FileComponent> children;
public Directory(String name) {
super(name);
children = new ArrayList<>();
}
@Override
public void add(FileComponent component) {
children.add(component);
}
@Override
public void remove(FileComponent component) {
children.remove(component);
}
@Override
public void display(int depth) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < depth; i++) {
sb.append("--");
}
System.out.println(sb + name);
for (FileComponent child : children) {
child.display(depth + 1);
}
}
}
public class Demo {
public static void main(String[] args) {
Directory root = new Directory("Root");
Directory documents = new Directory("Documents");
Directory pictures = new Directory("Pictures");
FileNode readme = new FileNode("Readme.txt");
FileNode image = new FileNode("image.jpg");
root.add(documents);
root.add(pictures);
documents.add(readme);
pictures.add(image);
System.out.println("File structure:");
root.display(0);
}
}