组合模式实验
一、结构型模式的原理
结构型模式(Structural Pattern)关注如何将现有类或对象组织在一起形成更加强大的结构。不同的结构型模式从不同的角度组合类或对象,它们在尽可能满足各种面向对象设计原则的同时,为类或对象的组合提供一系列巧妙的解决方案。
二、实验内容
某软件公司要开发一个杀毒(Antivirus)软件,该软件既可以对某个文件夹(Folder)杀毒,也可以对某个指定的文件(File)进行杀毒。该杀毒软件还可以根据各类文件的特点,为不同类型的文件提供不同的杀毒方式,例如图像文件(ImageFile)和文本文件(TextFile)的杀毒方式就有所差异。现使用组合模式绘制类图来设计该杀毒软件的整体框架。
[实验步骤]
(1) 分析案例,采用组合模式设计类图,确定组合模式的角色。
(2) 分析确定类图。
三、分析角色
- 抽象构件(Component) -
AntivirusObject
- 特点:在类图中,
AntivirusObject
是最顶层的抽象类,它定义了一个抽象方法scan()
。这个方法是所有具体构件和容器都需要实现的操作。 - 作用:它为整个组合结构提供了统一的接口,使得客户端可以一致地对待文件和文件夹对象。无论是文件还是文件夹,都可以通过
scan()
方法进行杀毒操作。 - 叶子构件(Leaf) -
ImageFile
和TextFile
- 特点:
ImageFile
和TextFile
是继承自AntivirusObject
的具体类。它们都实现了scan()
方法,这个方法用于对各自类型的文件进行杀毒操作。 - 作用:这些叶子构件代表了组合结构中的基本元素,即单个的文件。它们不能再包含其他子对象,只能执行自身的杀毒操作。
- 容器构件(Composite) -
Folder
- 特点:
Folder
类也继承自AntivirusObject
。它有一个ArrayList
类型的children
属性,用于存储子对象(可以是文件或子文件夹),同时有addChild(AntivirusObject)
方法用于添加子对象,scan()
方法用于遍历调用子对象的scan()
方法。 - 作用:
Folder
作为容器构件,可以包含多个AntivirusObject
(文件或子文件夹)。当对文件夹进行杀毒操作时,它会递归地调用其内部所有子对象的scan()
方法,实现对整个文件夹及其内部所有内容的杀毒操作。
实现结果
画出的UML如下图所示:
抽象类AntivirusObject.java
public abstract class AntivirusObject {
public AntivirusObject (){
}
public void finalize() throws Throwable {
}
public abstract void scan();
}
Folder.java
public class Folder extends AntivirusObject {
private ArrayList<AntivirusObject> children;
public Folder() {
// 初始化children列表
children = new ArrayList<>();
}
public void addChild(AntivirusObject child) {
children.add(child);
}
public void scan() {
System.out.println("正在扫描文件夹...");
for (AntivirusObject child : children) {
child.scan();
}
}
}
ImageFile.java
public class ImageFile extends AntivirusObject {
public ImageFile(){
}
public void finalize() throws Throwable {
super.finalize();
}
public void scan(){
System.out.println("正在对图像文件进行杀毒");
}
}
TextFile.java
public class TextFile extends AntivirusObject {
public TextFile(){
}
public void finalize() throws Throwable {
super.finalize();
}
public void scan(){
System.out.println("正在对文本文件进行杀毒");
}
}
测试类Client.java
public class Client {
public static void main(String[] args) {
ImageFile imageFile = new ImageFile();
TextFile textFile = new TextFile();
Folder folder = new Folder();
folder.addChild(imageFile);
folder.addChild(textFile);
// 单独扫描
imageFile.scan();
textFile.scan();
// 全体扫描
folder.scan();
}
}
输出
正在对图像文件进行杀毒
正在对文本文件进行杀毒
正在扫描文件夹...
正在对图像文件进行杀毒
正在对文本文件进行杀毒
评论区