组合模式(Composite Pattern)将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式使得用户可以使用一致的方法操作单个对象和组合对象。
假设一个场景:一个杀毒软件叫ABKing,我们模拟它的杀毒逻辑。首先需要选定一个文件夹吧,然后这个文件夹里的每一个文件都需要被扫描。在Linux系统中,文件夹也被视为文件,只不过是特殊的文件而已,相应地,文件和文件夹其实有共同之处。
所以我们写一个接口:
1 package top.bigking.composite; 2 3 import java.util.ArrayList; 4 import java.util.List; 5 6 /** 7 * @Author ABKing 8 * @since 2020/2/18 下午9:00 9 **/ 10 public interface AbstractFile { 11 void killVirus(); 12 }
两个实现类(文件和文件夹):
1 package top.bigking.composite; 2 3 /** 4 * @Author ABKing 5 * @since 2020/2/18 下午9:20 6 **/ 7 public class MyFile implements AbstractFile{ 8 private String name; 9 10 public MyFile(String name) { 11 this.name = name; 12 } 13 14 public String getName() { 15 return name; 16 } 17 18 @Override 19 public void killVirus() { 20 System.out.println("ABKing杀毒软件已成功清除 " + name + " 病毒文件!"); 21 } 22 }
1 package top.bigking.composite; 2 3 import java.util.ArrayList; 4 import java.util.List; 5 6 /** 7 * @Author ABKing 8 * @since 2020/2/18 下午9:21 9 **/ 10 public class MyFolder implements AbstractFile{ 11 private String name; 12 private List<AbstractFile> list = new ArrayList<>(); 13 14 public MyFolder(String name) { 15 this.name = name; 16 } 17 18 @Override 19 public void killVirus() { 20 System.out.println("开始清除文件夹:" + name); 21 for (AbstractFile file: list) { 22 file.killVirus(); 23 } 24 System.out.println("清除文件夹 " + name + " 成功!"); 25 } 26 public void add(AbstractFile file){ 27 list.add(file); 28 } 29 public void remove(AbstractFile file){ 30 list.remove(file); 31 } 32 public AbstractFile getChild(int index){ 33 return list.get(index); 34 } 35 }
JUnit单元测试:
1 package top.bigking.composite; 2 3 import org.junit.Test; 4 5 /** 6 * @Author ABKing 7 * @since 2020/2/18 下午9:21 8 **/ 9 public class TestComposite { 10 @Test 11 public void testComposite(){ 12 MyFolder folder = new MyFolder("主文件夹"); 13 MyFolder folder1 = new MyFolder("毒文件夹"); 14 AbstractFile f1 = new MyFile("文件1"); 15 AbstractFile f2 = new MyFile("文件2"); 16 AbstractFile f3 = new MyFile("文件3"); 17 AbstractFile f4 = new MyFile("文件4"); 18 AbstractFile f5 = new MyFile("文件5"); 19 20 folder.add(f1); 21 folder.add(f2); 22 folder1.add(f3); 23 folder1.add(f4); 24 folder.add(folder1); 25 folder.add(f5); 26 27 folder.killVirus(); 28 } 29 }
运行结果:
开始清除文件夹:主文件夹
ABKing杀毒软件已成功清除 文件1 病毒文件!
ABKing杀毒软件已成功清除 文件2 病毒文件!
开始清除文件夹:毒文件夹
ABKing杀毒软件已成功清除 文件3 病毒文件!
ABKing杀毒软件已成功清除 文件4 病毒文件!
清除文件夹 毒文件夹 成功!
ABKing杀毒软件已成功清除 文件5 病毒文件!
清除文件夹 主文件夹 成功!
开发中的应用场景:
原文:https://www.cnblogs.com/ABKing/p/12329214.html