组合模式
用面向对象的方式来处理树形结构
组合多个对象形成树形结构以表示具有“整体-部分”关系的层次结构。
在组合模式中引入了抽象构件类Component,它是所有容器类和叶子类的公共父类。
角色
Component抽象构件
可以是接口或抽象类
为叶子构件和容器构件对象声明接口
Leaf叶子构件
叶子节点没有子节点
Composite容器构件
容器节点包含子节点,其子节点可以是叶子节点,也可以是容器节点。

杀毒软件案例

1.抽象文件类

package Composite;

/**
* Created by Jiqing on 2016/10/5.
*/
abstract class AbstractFile {
public abstract void add(AbstractFile file);
public abstract void remove(AbstractFile file);
public abstract AbstractFile getChild(int i);
public abstract void killVirus();
}

2.Image文件类

package Composite;

/**
* Created by Jiqing on 2016/10/5.
*/
public class ImageFile extends AbstractFile{
private String name;
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 + "'进行杀毒----"); } }

3.文本文件类

package Composite;

/**
* Created by Jiqing on 2016/10/5.
*/
public class TextFile extends AbstractFile{
private String name;
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 + "'进行杀毒----"); } }

4.视频文件类

package Composite;

/**
* Created by Jiqing on 2016/10/5.
*/
public class VideoFile extends AbstractFile{
private String name;
public VideoFile (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 + "'进行杀毒----"); } }

5.文件夹类

package Composite;

import java.util.ArrayList;

/**
* Created by Jiqing on 2016/10/5.
*/
public class Folder extends AbstractFile{
private ArrayList<AbstractFile> fileList = new ArrayList<AbstractFile>(); // 规定集合中成员类型
private String name;
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 (AbstractFile)fileList.get(i); // 强制转换为类型
} public void killVirus() {
System.out.println("****对文件夹'" + name + "'进行杀毒****"); // 模拟杀毒
// 递归调用成员构件的杀毒方法
for (Object obj :fileList) {
((AbstractFile)obj).killVirus();
}
}
}

6.客户端

package Composite;

/**
* Created by Jiqing on 2016/10/5.
*/
public class Client {
public static void main(String args[]) {
AbstractFile file1,file2,file3,file4,file5,folder1,folder2,folder3,folder4;
folder1 = new Folder("Jim的资料");
folder2 = new Folder("图像文件");
folder3 = new Folder("文本文件");
folder4 = new Folder("视频文件"); file1 = new ImageFile("小龙女.jpg");
file2 = new ImageFile("张无忌.gif");
file3 = new TextFile("九阴真经.txt");
file4 = new TextFile("葵花宝典.doc");
file5 = new VideoFile("笑傲江湖.rmvb"); folder2.add(file1);
folder2.add(file2);
folder3.add(file3);
folder3.add(file4);
folder4.add(file5);
folder1.add(folder2);
folder1.add(folder3);
folder1.add(folder4); folder1.killVirus();
}
}

执行结果

05-28 18:57