前言:
组合模式可以看做是文件系统,文件夹和文件都是一种存贮方式,文件又分为图像、文本、视频等文件,文件夹下有包含有其他的文件或者文件夹
他们每一个都是一个节点,因此客户端可以使用统一的方式来进行处理。文件夹下包含着一个集合用于存储它的子节点
把部分和整体的关系使用树形结构来表示,从而使客户端可以使用统一的方式
处理部分的对象和整体对象
组合模式核心 :
抽象构件(Component)角色:定义了叶子和容器构件的共同点
叶子(Leaf) 构件角色:无子节点
容器(Composite)构件角色:有容器特征,可以包含子节点
一、代码实现
package Composite;
import java.util.ArrayList;
import java.util.List;
//相当于基本的节点
public interface AbstractFile {
void killVIrus();
}
//不同的文件类型
class ImageFile implements AbstractFile
{ private String name;
public ImageFile(String name) {
super();
this.name = name;
}
@Override
public void killVIrus() {
// TODO 自动生成的方法存根
System.out.println("对图像文件"+name+"进行查杀");
}
}
class TextFile implements AbstractFile
{ private String name;
public TextFile(String name) {
super();
this.name = name;
}
@Override
public void killVIrus() {
// TODO 自动生成的方法存根
System.out.println("对文本文件"+name+"进行查杀");
}
}
class VideoFile implements AbstractFile
{ private String name;
public VideoFile(String name) {
super();
this.name = name;
}
@Override
public void killVIrus() {
// TODO 自动生成的方法存根
System.out.println("对视屏文件"+name+"进行查杀");
}
}
//文件夹,同样也是节点
class Folder implements AbstractFile
{ private String name;
public Folder(String name) {
super();
this.name = name;
}
//有一个集合包含着它的子节点
List<AbstractFile> list=new ArrayList<AbstractFile>();
public void add(AbstractFile abstractFile)
{
list.add(abstractFile);
// System.out.println("成功将文件添加!");
}
public void remove(AbstractFile abstractFile)
{
list.add(abstractFile);
// System.out.println("成功将文件删除!");
}
public AbstractFile get(Integer index)
{
return list.get(index);
}
@Override
//递归遍历
public void killVIrus() {
// TODO 自动生成的方法存根
System.out.println("对文件夹"+name+"进行查杀");
for (AbstractFile abstractFile : list) {
abstractFile.killVIrus();
}
}
}
调用:
package Composite;
public class Client {
public static void main(String[] args) {
AbstractFile f2,f3,f4,f5;
Folder folder,folder2;
f2=new ImageFile("扬哥哥的大头照.jpg");
f3=new TextFile("日志.txt");
folder=new Folder("我的收藏");
folder2=new Folder("我的收藏子文件");
folder.add(f2);
folder.add(f3);
folder.add(folder2);
folder.killVIrus();
}
}
实现结果:
二、应用场景
操作系统的资源管理器
GUI中的容器层次图
XML文件解析
OA系统中组织结构处理
Junit单元测试框架
底层设计就是组合模式,TestCase(叶子) TestUnite(容器) Test接口