本文以磁盘杀毒为例介绍。先定义一个磁盘接口,如下:
/**
* 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杀毒完成!