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殺毒完成!

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章