组合模式把整体和部分用树形结构来表示,就运用组合的方式进行对象操作。
抽象构件(Component):定义了叶子和容器构件的共同点。
叶子构件(Leaf):无子节点。
容器构件(Composite):有容器特征,可以包含子节点。
具体代码演示,模拟杀毒:
1.抽象组件:
/**
* 抽象组件
*/
public interface AbstractFile {
void killVirus();
}
2.容器组件,Folder文件夹:
/**
* 容器组件
*/
class Folder implements AbstractFile{
private String name;
//用于存放本容器构件下的子节点
private List<AbstractFile> list=new ArrayList<>();
public Folder(String name) {
this.name = name;
}
public void add(AbstractFile file){
list.add(file);
}
public AbstractFile getChild(int index){
return list.get(index);
}
public void remove(AbstractFile file){
list.remove(file);
}
@Override
public void killVirus() {
System.out.println("--文件夹:"+name+"--查杀");
//递归,查杀
for (AbstractFile file : list) {
file.killVirus();
}
}
}
容器组件实现了抽象组件,自定义了一个list<抽象组件>的集合,并在抽象方法中对集合进行了具体的操作。
3.两个叶子组件:
(1).照片文件
//照片叶子组件
class ImageFile implements AbstractFile{
private String name;
public ImageFile(String name) {
this.name = name;
}
@Override
public void killVirus() {
System.out.println("--图像文件--"+name+"--查杀");
}
}
(2).文本文件
class TxtFile implements AbstractFile{
private String name;
public TxtFile(String name) {
this.name = name;
}
@Override
public void killVirus() {
System.out.println("--文本文件--"+name+"--查杀");
}
}
4.模拟杀毒测试:
public static void main(String[] args) {
AbstractFile f2,f3,f6,f7;
Folder f1=new Folder("我的收藏");
f2=new ImageFile("av.jpg");
f3=new TxtFile("我的种子");
f1.add(f2);
f1.add(f3);
f1.killVirus();
System.out.println("----------------");
Folder f4 = new Folder("我的文件夹");
f6=new ImageFile("天龙八部");
f7=new TxtFile("斗破苍穹");
f4.add(f6);
f4.add(f7);
f4.add(f1);
f4.killVirus();
}
结果:--文件夹:我的收藏--查杀
--图像文件--av.jpg--查杀
--文本文件--我的种子--查杀
----------------
--文件夹:我的文件夹--查杀
--图像文件--天龙八部--查杀
--文本文件--斗破苍穹--查杀
--文件夹:我的收藏--查杀
--图像文件--av.jpg--查杀
--文本文件--我的种子--查杀