Java设计模式(十三)之组合模式(Composite)

 

本文以磁盘杀毒为例介绍。先定义一个磁盘接口,如下:

/**
 * Created by leboop on 2020/5/26.
 */
public interface Disk {
    String name = "";

    void add(Disk disk);

    void remove(Disk disk);

    void kill();
}

给磁盘杀毒的本质,是给磁盘下的每个目录杀毒,所以下面我们定义一个文件目录类,如下:

/**
 * Created by leboop on 2020/5/26.
 */
public class FileDirectory implements Disk {
    String name="";

    List<Disk> disks = new ArrayList<>();

    public FileDirectory(String name) {
        this.name = name;
    }

    @Override
    public void add(Disk disk) {
        disks.add(disk);
    }

    @Override
    public void remove(Disk disk) {
        disk.remove(disk);
    }

    @Override
    public void kill() {
        System.out.println("===================目录"+this.name+"杀毒开始===================");
        for (Disk disk : disks) {
            disk.kill();
        }
        System.out.println("===================目录"+this.name+"杀毒结束===================");
    }
}

文件目录下可以有子目录和文件,定义一个数据列表表示该文件目录下的文件或者文件目录。add方法表示可以向该文件目录下添加文件目录或者文件,remove表示可以移除该文件目录下的文件目录或者文件。kill方法是杀毒功能的具体,给当前文件目录杀毒实际是给其下的文件目录和文件杀毒。所以本质是给文件杀毒,下面我们定义文件类,如下:

/**
 * Created by leboop on 2020/5/26.
 */
public class File implements Disk {
    private String name="";

    public File(String name) {
        this.name = name;
    }

    @Override
    public void add(Disk disk) {
//        无需实现,文件下无法添加文件
    }

    @Override
    public void remove(Disk disk) {
//         无需实现,文件下无法删除文件
    }

    @Override
    public void kill() {
        System.out.println("++++++文件"+this.name+"杀毒开始+++++++");
        System.out.println("杀毒中,请等待……");
        System.out.println("++++++文件"+this.name+"杀毒结束+++++++");
    }
}

客户端程序如下调用:

/**
 * Created by leboop on 2020/5/26.
 */
public class CompositeMain {
    public static void main(String[] args) {
//        目录结构如下
//        dir1-------dir2
//               |
//                ---dir3------file_1
//                         |
//                          ---file_2
//                         |
//                          ---file_3

        File f1=new File("file_1");
        File f2=new File("file_2");
        File f3=new File("file_3");
        FileDirectory dir1=new FileDirectory("dir_1");
        FileDirectory dir2=new FileDirectory("dir_2");
        FileDirectory dir3=new FileDirectory("dir_3");
//        文件目录dir_3下放置三个文件
        dir3.add(f1);
        dir3.add(f2);
        dir3.add(f3);
//        文件目录dir1下放置两个目录dir2和dir3
        dir1.add(dir2);
        dir1.add(dir3);
//        目录dir_1杀毒
        dir1.kill();
    }
}

程序输出结果

===================目录dir_1杀毒开始===================
===================目录dir_2杀毒开始===================
===================目录dir_2杀毒结束===================
===================目录dir_3杀毒开始===================
++++++文件file_1杀毒开始+++++++
杀毒中,请等待……
++++++文件file_1杀毒结束+++++++
++++++文件file_2杀毒开始+++++++
杀毒中,请等待……
++++++文件file_2杀毒结束+++++++
++++++文件file_3杀毒开始+++++++
杀毒中,请等待……
++++++文件file_3杀毒结束+++++++
===================目录dir_3杀毒结束===================
===================目录dir_1杀毒结束===================

杀毒过程如下:

进入文件目录dir_1下,下面有两个文件目录dir_2和dir_3,先给dir_2杀毒,dir_2是空文件目录,杀毒结束。紧接着给dir_3杀毒,该文件目录下有3个文件file_1,file_2,file_3,然后依次给三个文件杀毒,三个文件杀毒结束后,dir_3杀毒也就结束,此时整个文件目录dir_1杀毒完成!

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

leboop-L

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值