• 组合模式


    组合模式(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接口(抽象)

        

    金麟岂是池中物,一遇风云便化龙!
  • 相关阅读:
    shell脚本根据端口号kill掉进程
    使用netstat -ano 查看机器端口的占用情况(windows环境)
    分享一两个小工具,
    将压缩文件伪装图片格式文件以及将python文件转化为exe文件(测试完,真的有效)
    celery 异步任务 周期任务 定时任务的实现
    wsgi、uwsgi、asgi协议的关系
    centos7忘记密码更改步骤
    工作遇到的坑以及自己的学习悟道之道
    案例小集锦
    asp.net mvc部署
  • 原文地址:https://www.cnblogs.com/ABKing/p/12329214.html
Copyright © 2020-2023  润新知