目 录CONTENT

文章目录

Java-软件模式实验-组合模式

~梓
2024-12-25 / 0 评论 / 0 点赞 / 37 阅读 / 0 字
温馨提示:
本文最后更新于2024-12-25,若内容或图片失效,请留言反馈。 部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

组合模式实验

一、结构型模式的原理
结构型模式(Structural Pattern)关注如何将现有类或对象组织在一起形成更加强大的结构。不同的结构型模式从不同的角度组合类或对象,它们在尽可能满足各种面向对象设计原则的同时,为类或对象的组合提供一系列巧妙的解决方案。

二、实验内容

某软件公司要开发一个杀毒(Antivirus)软件,该软件既可以对某个文件夹(Folder)杀毒,也可以对某个指定的文件(File)进行杀毒。该杀毒软件还可以根据各类文件的特点,为不同类型的文件提供不同的杀毒方式,例如图像文件(ImageFile)和文本文件(TextFile)的杀毒方式就有所差异。现使用组合模式绘制类图来设计该杀毒软件的整体框架。
[实验步骤]
(1) 分析案例,采用组合模式设计类图,确定组合模式的角色。
(2) 分析确定类图。

三、分析角色

  1. 抽象构件(Component) - AntivirusObject
  2. 特点:在类图中,AntivirusObject是最顶层的抽象类,它定义了一个抽象方法scan()。这个方法是所有具体构件和容器都需要实现的操作。
  3. 作用:它为整个组合结构提供了统一的接口,使得客户端可以一致地对待文件和文件夹对象。无论是文件还是文件夹,都可以通过scan()方法进行杀毒操作。
  4. 叶子构件(Leaf) - ImageFileTextFile
  5. 特点ImageFileTextFile是继承自AntivirusObject的具体类。它们都实现了scan()方法,这个方法用于对各自类型的文件进行杀毒操作。
  6. 作用:这些叶子构件代表了组合结构中的基本元素,即单个的文件。它们不能再包含其他子对象,只能执行自身的杀毒操作。
  7. 容器构件(Composite) - Folder
  8. 特点Folder类也继承自AntivirusObject。它有一个ArrayList类型的children属性,用于存储子对象(可以是文件或子文件夹),同时有addChild(AntivirusObject)方法用于添加子对象,scan()方法用于遍历调用子对象的scan()方法。
  9. 作用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();
    }
}

输出

正在对图像文件进行杀毒
正在对文本文件进行杀毒
正在扫描文件夹...
正在对图像文件进行杀毒
正在对文本文件进行杀毒
0

评论区