组合模式用于将对象组合成树形结构以表示“部分-整体”的层次结构,使客户端可以统一对待单个对象和组合对象。
public abstract class FileComponent {
protected String name;
public FileComponent(String name) { this.name = name; }
public abstract void display(String indent);
}
public class FileLeaf extends FileComponent {
public FileLeaf(String name) {
super(name);
}
@Override
public void display(String indent) {
System.out.println(indent + " " + name);
}
}
import java.util.ArrayList;
import java.util.List;
public class FolderComposite extends FileComponent {
private List children = new ArrayList<>();
public FolderComposite(String name) {
super(name);
}
public void add(FileComponent component) {
children.add(component);
}
public void remove(FileComponent component) {
children.remove(component);
}
@Override
public void display(String indent) {
System.out.println(indent + " " + name);
for (FileComponent component : children) {
component.display(indent + " ");
}
}
}
public class Client {
public static void main(String[] args) {
FolderComposite root = new FolderComposite("Root");
FolderComposite docs = new FolderComposite("Documents");
FolderComposite pics = new FolderComposite("Pictures");
FileLeaf file1 = new FileLeaf("Resume.pdf");
FileLeaf file2 = new FileLeaf("CoverLetter.docx");
FileLeaf img1 = new FileLeaf("Photo.jpg");
docs.add(file1);
docs.add(file2);
pics.add(img1);
root.add(docs);
root.add(pics);
root.display("");
}
}
清晰地定义树形结构
客户端可以一致性地处理单个对象和组合对象
增加新类型节点方便
抽象层与组合层差异被忽略,可能降低类型安全
违反开闭原则:添加新功能可能需要修改组件接口
当你需要表示一个树形结构,并希望客户端可以**透明地处理所有节点(不关心是组合还是叶子)**时,组合模式就是你的首选。