处理树形结构,叶子节点和子树。如操作系统的文件 看作(叶子节点)/文件夹看作(子树);软件系统的菜单结构也是树形,具体选项看作(叶子节点)/二级菜单看作(子树)。
组合模式就是要为叶子节点和子树抽象出统一的接口,叶子节点进行具体操作,子树进行递归处理。
以文件系统为例。我要给某个路径下的所有文件进行杀毒。
为文件和文件夹抽象出一个公共抽象类AbstractFile
interface AbstractFile{
public void add(AbstractFile abstractFile);
public void remove(AbstractFile abstractFile);
public void killVirus();
}
某个叶子节点,如文本文件
class TextFile implements AbstractFile{
String name;
public TextFile(String name) {
this.name = name;
}
@Override
public void add(AbstractFile abstractFile) {
System.out.println("我是文件,无添加方法");
}
@Override
public void remove(AbstractFile abstractFile) {
System.out.println("我是文件,无删除方法");
}
@Override
public void killVirus() {
System.out.println("我是Text文件,正在杀毒"+name);
}
}
子树,充当容器。也就是文件夹
class Folder implements AbstractFile{
ArrayList <AbstractFile> list=new ArrayList<AbstractFile>();
@Override
public void add(AbstractFile abstractFile) {
System.out.println("我是文件夹,正在添加文件或文件夹");
list.add(abstractFile);
}
@Override
public void remove(AbstractFile abstractFile) {
System.out.println("我是文件夹,正在删除文件或文件夹");
list.remove(abstractFile);
}
@Override
public void killVirus() {
System.out.println("我是文件夹,无法杀毒");
for (AbstractFile a:list){
a.killVirus();
}
}
}
客户端调用
public static void main(String[] args) {
// 创建一个D盘路径(子树)
AbstractFile D=new Folder();
// 创建一个文本文件夹(子树)
AbstractFile myText=new Folder();
// 文本文件夹下有语文课件,数学课件
myText.add(new TextFile("语文课件")); myText.add(new TextFile("数学课件"));
// 文本文件夹属于 D盘路径(子树)
D.add(myText);
// 给D盘的文件杀毒,文件夹会递归找到文件
D.killVirus();
}
总结
核心就是忽略整体与部分的差异,客户端可以一致的对待,子树容器就去处理它的所以孩子,叶子节点就处理业务。直到递归完所有叶子节点。