组合模式内一共有三个角色:
组合部件(Component):它是一个抽象接口
叶子(Leaf):在组合中表示子节点对象
合成部件(Composite):在组合表示父节点对象,自己还有孩子
当遇到树型结构,考虑使用组合模式
模拟杀毒软件框架例子:
定义一个抽象接口:
public interface AbstractFile {
void killVirus();//杀毒
}
两个叶子结构类:
class ImageFile implements AbstractFile {//叶子结构,图片文件
private String name;
public ImageFile(String name) {
this.name = name;
}
@Override
public void killVirus() {
System.out.println("杀毒-----"+name+"图片文件");
}
}
class VideoFile implements AbstractFile {//叶子结构2,音频文件
private String name;
public VideoFile(String name) {
this.name = name;
}
@Override
public void killVirus() {
System.out.println("杀毒-----"+name+"音频文件");
}
}
一个父节点类:
class Folder implements AbstractFile{//文件夹类
private String name;
private List<AbstractFile> list=new ArrayList();
public Folder(String name) {
this.name = name;
}
public Folder add(AbstractFile file){
list.add(file);
return this;
}
public void remove(AbstractFile file){
list.remove(file);
}
public AbstractFile getChild(int index){//根据下标得到文件夹子节点
return list.get(index);
}
@Override
public void killVirus() {
System.out.println("开始文件夹"+this.name+"查杀");
for (AbstractFile file:list){
file.killVirus();//天然递归,当下级也是非叶子节点时,递归遍历
}
}
}
最后客户端实现组合模式:
public class client {
public static void main(String[] args) {
Folder f1;
AbstractFile f2,f3;
f1 = new Folder("我的文件夹");
f2=new ImageFile("图片.jpg");
f3=new VideoFile("音频.MP3");
f1.add(f2).add(f3);
f1.killVirus();
}
}