组合模式

组合模式(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 病毒文件!
清除文件夹 主文件夹 成功!

开发中的应用场景:

  • 操作系统的资源管理器
  • GUI中的容器层次图
  • XML文件解析
  • OA系统中,组织架构的处理
  • JUnit单元测试框架:底层设计就是典型的组合模式,TestCase(叶子)、TestUnite(容器)、Test接口(抽象)

    

金麟岂是池中物,一遇风云便化龙!
原文地址:https://www.cnblogs.com/ABKing/p/12329214.html