定义
组合多个对象用来表示具有"整体-部分"关系的层次结构。它是一种对象结构型模式。
所以目录与文件可以利用组合模式。
UML示例
代码示例
抽象构件
// 抽象构件
abstract class AbstractFile {
protected String name;
public abstract void add(AbstractFile file);
public abstract void remove(AbstractFile file);
public abstract AbstractFile getChild(int i);
public abstract void killVirus();
}
叶子构件1
// 图像文件类:叶子构件
public class ImageFile extends AbstractFile {
public ImageFile(String name) {
this.name = name;
}
public void add(AbstractFile file) {
System.out.println("不支持");
}
public void remove(AbstractFile file) {
System.out.println("不支持");
}
public AbstractFile getChild(int i) {
System.out.println("不支持");
return null;
}
public void killVirus() {
System.out.println("对图像文件 <" + name + "> 进行杀毒");
}
}
叶子构件2
// 文本文件类:叶子构件
public class TextFile extends AbstractFile{
public TextFile(String name) {
this.name = name;
}
public void add(AbstractFile file) {
System.out.println("不支持");
}
public void remove(AbstractFile file) {
System.out.println("不支持");
}
public AbstractFile getChild(int i) {
System.out.println("不支持");
return null;
}
public void killVirus() {
System.out.println("对文本文件 <" + name + "> 进行杀毒");
}
}
容器构件
// 文件夹类:容器构件
public class Folder extends AbstractFile {
// 定义集合fileList 储存AbstractFile 类成员
private ArrayList<AbstractFile> fileList = new ArrayList<AbstractFile>();
public Folder(String name) {
this.name = name;
}
public void add(AbstractFile file) {
fileList.add(file);
}
public void remove(AbstractFile file) {
fileList.remove(file);
}
public AbstractFile getChild(int i) {
return fileList.get(i);
}
public void killVirus() {
System.out.println("---对文件夹 <" + name + "> 进行杀毒----");
for (AbstractFile obj : fileList) {
obj.killVirus();
}
}
}
客户端
public class Client {
public static void main(String[] args) {
AbstractFile file1, file2, file3, file4, file5, folder1,
folder2, folder3;
folder1 = new Folder("Sunny的资料");
folder2 = new Folder("图像资料");
folder3 = new Folder("文本文件");
file1 = new ImageFile("小龙女.jpg");
file2 = new ImageFile("张无忌.gif");
file3 = new TextFile("杂乱的资料.txt");
file4 = new TextFile("葵花宝典.txt");
file5 = new TextFile("笑傲江湖.txt");
folder1.add(file3);
folder2.add(file1);
folder2.add(file2);
folder3.add(file4);
folder3.add(file5);
folder1.add(folder2);
folder1.add(folder3);
folder1.killVirus();
}
}