本文以磁盤殺毒爲例介紹。先定義一個磁盤接口,如下:
/**
* 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殺毒完成!