组合模式常用于文件夹文件
文件和文件夹的抽象类
public abstract class AbstractFile {
protected String name;
public void printName() {
System.out.println(name);
}
public abstract boolean addChild(AbstractFile file);
public abstract boolean removeChild(AbstractFile file);
public abstract List<AbstractFile> getChildren();
}
文件夹类
public class Folder extends AbstractFile {
private List<AbstractFile> childList;
public Folder(String name) {
this.name = name;
this.childList = new ArrayList<>();
}
@Override
public boolean addChild(AbstractFile file) {
return childList.add(file);
}
@Override
public boolean removeChild(AbstractFile file) {
return childList.remove(file);
}
@Override
public List<AbstractFile> getChildren() {
return childList;
}
}
文件类
public class File extends AbstractFile {
public File(String name) {
this.name = name;
}
@Override
public boolean addChild(AbstractFile file) {
return false;
}
@Override
public boolean removeChild(AbstractFile file) {
return false;
}
@Override
public List<AbstractFile> getChildren() {
return null;
}
}
演示类
public class Demo {
public static void main(String[] args) {
AbstractFile rootFolder = new Folder("C:\\");
AbstractFile compositeFolder = new Folder("composite");
AbstractFile windowsFolder = new Folder("windows");
AbstractFile file = new File("TestComposite.java");
rootFolder.addChild(compositeFolder);
rootFolder.addChild(windowsFolder);
compositeFolder.addChild(file);
printTree(rootFolder);
}
private static void printTree(AbstractFile file) {
file.printName();
List<AbstractFile> list = file.getChildren();
if (list == null || list.isEmpty()) return;
for (AbstractFile l : list) {
printTree(l);
}
}
}
演示结果