组合模式的使用场景:
——把部分与整体的关系用树形结构来表示,从而使客户端可以使用统一的方式处理部分对象和整体对象。
组合模式的核心:
——抽象构件(Component)角色:定义了叶子和容器构件的共同点。
——叶子构件角色:无子节点
——容器(Composite)构件角色:有容器特征,可以包含子节点。
下面以杀毒的流程来模拟一下组合模式的实现:
package composite;
import java.util.ArrayList;
import java.util.List;
/**
* 简单模拟杀毒软件的杀毒构架
* @author acer
*/
//抽象构件角色
public interface AbstractFile {
public void killVirus();
}
//叶子构建
class ImageFile implements AbstractFile{
private String name;
public ImageFile(String s) {
this.name = s;
}
@Override
public void killVirus() {
System.out.println("对图像文件"+name+"进行查杀");
}
}
//叶子构建
class TextFile implements AbstractFile{
private String name;
public TextFile(String s) {
this.name = s;
}
@Override
public void killVirus() {
System.out.println("对文本文件"+name+"进行查杀");
}
}
//叶子构建
class VideoFile implements AbstractFile{
private String name;
public VideoFile(String s) {
this.name = s;
}
@Override
public void killVirus() {
System.out.println("对视频文件"+name+"进行查杀");
}
}
//容器构件角色
class Folder implements AbstractFile{
private String name;
//定义容器,用来存放本容器构建下的子节点
private List<AbstractFile> list = new ArrayList<AbstractFile>();
public Folder(String name) {
this.name = name;
}
public void add(AbstractFile file) {
list.add(file);
}
public void remove(AbstractFile file){
list.remove(file);
}
public AbstractFile getChild(int index){
return list.get(index);
}
@Override
public void killVirus() {
System.out.println("对文件夹"+name+"进行查杀");
for(AbstractFile file : list) {
//这里会形成一个递归,如果文件是一个文件夹,将不断的进行递归
file.killVirus();
}
}
}
测试:
package composite;
public class Client {
public static void main(String[] args) {
AbstractFile f2,f3,f4;
Folder f1 = new Folder("我的文件夹");
f2 = new ImageFile("feige.img");
f3 = new TextFile("demo.txt");
f1.add(f2);
f1.add(f3);
f1.killVirus();
}
}
这样就实现了组合模式。组合模式的应用场景很多:如资源管理器 xml文件解析 JUnit单元测试。