2024/11/06

news/2024/11/6 9:08:41/文章来源:https://www.cnblogs.com/zhenaifen/p/18529218

软件设计 实验10:组合模式

用透明组合模式实现教材中的“文件夹浏览”这个例子。

类图

 

public abstract class AbstractFile {
    public abstract void add(AbstractFile element);
    public abstract void remove(AbstractFile element);
    public abstract void display(int depth);
}

 

public class Folder extends AbstractFile{
    private ArrayList<AbstractFile> fileList = new ArrayList<>();
    private String fileName;

    public Folder(String fileName)
    {
        this.fileName = fileName;
    }

    @Override
    public void add(AbstractFile element) {

        fileList.add(element);
        // 获取类的简单名称
       
String elementName = element.getClass().getSimpleName();
        //输出提示信息
       
System.out.println(fileName + "添加了一个" + elementName);
    }

    @Override
    public void remove(AbstractFile element) {

        fileList.remove(element);
        // 获取类的简单名称
       
String elementName = element.getClass().getSimpleName();
        //输出提示信息
       
System.out.println(fileName + "删除了一个" + elementName);
    }

    @Override
    public void display(int depth) {
        // 根据深度打印缩进
       
for (int i = 0; i < depth; i++) {
            System.out.print("  "); // Indentation
       
}
        System.out.println("+" + fileName);
        for (AbstractFile object : fileList) {
            object.display(depth + 1); // Increase depth for children
       
}
    }
}

 

public class ImageFile extends AbstractFile
{
    private String fileName;

    public ImageFile(String fileName)
    {
        this.fileName = fileName;
    }

    @Override
    public void add(AbstractFile element)
    {
        System.out.println("添加了一个图片文件");
    }

    @Override
    public void remove(AbstractFile element)
    {
        System.out.println("移除了一个图片文件");
    }

    @Override
    public void display(int depth) {
        for (int i = 0; i < depth; i++) {
            System.out.print("  "); // Indentation
       
}
        System.out.println(" -" + fileName + " 图片文件");
    }
}

 

public class TextFile extends AbstractFile
{
    private String fileName;

    public TextFile(String fileName)
    {
        this.fileName = fileName;
    }

    @Override
    public void add(AbstractFile element)
    {
        System.out.println("添加了一个文本文件");
    }

    @Override
    public void remove(AbstractFile element)
    {
        System.out.println("移除了一个文本文件");
    }

    @Override
    public void display(int depth) {
        for (int i = 0; i < depth; i++) {
            System.out.print("  "); // Indentation
       
}
        System.out.println(" -" + fileName + " 文本文件");
    }
}

 

public class VideoFile extends AbstractFile
{
    private String fileName;

    public VideoFile(String fileName)
    {
        this.fileName = fileName;
    }

    @Override
    public void add(AbstractFile element)
    {
        System.out.println("添加了一个视频文件");
    }

    @Override
    public void remove(AbstractFile element)
    {
        System.out.println("删除了一个视频文件");
    }

    @Override
    public void display(int depth) {
        for (int i = 0; i < depth; i++) {
            System.out.print("  "); // Indentation
       
}
        System.out.println(" -" + fileName + " 视频文件");
    }
}

 

public class App
{
    public static void main(String[] args) {
        // 创建根文件夹
       
Folder rootFolder = new Folder("根文件夹");

        // 创建子文件夹
       
Folder imagesFolder = new Folder("图片文件夹");
        Folder videosFolder = new Folder("视频文件夹");

        // 创建文件
       
ImageFile image1 = new ImageFile("图片1.jpg");
        ImageFile image2 = new ImageFile("图片2.png");
        VideoFile video1 = new VideoFile("视频1.mp4");
        TextFile text1 = new TextFile("文本1.txt");

        // 在根文件夹中添加子文件夹和文件
       
rootFolder.add(imagesFolder);
        rootFolder.add(videosFolder);
        rootFolder.add(text1);

        // 在图片文件夹中添加图像文件
       
imagesFolder.add(image1);
        imagesFolder.add(image2);

        // 在视频文件夹中添加视频文件
       
videosFolder.add(video1);

        // 显示文件夹结构
       
rootFolder.display(0);
    }
}

运行示例结果

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/827494.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SQLSTATE[HY000] [1045] Access denied for user ‘root‘@‘localhost‘ (using password: YES)

错误解析错误代码:SQLSTATE[HY000] [1045] 错误信息:Access denied for user ‘root’@‘localhost’ (using password: YES)可能的原因密码错误:提供的密码与数据库中存储的密码不匹配。 用户权限问题:用户root可能没有从localhost访问数据库的权限。 配置文件问题:MySQL…

帝国CMS更改域名后信息地址中的域名不变解决方法

修改系统参数设置进入“系统参数设置 - 基本属性 - 网站地址”,设置为 /。 不要填写具体的域名,以避免信息地址变成绝对地址。更新信息页地址进入“系统 - 数据更新 - 更新信息页地址”,选择相应的数据表,点击“扫码添加技术【解决问题】专注中小企业网站建设、网站安全12年…

帝国CMS系统后台批量删除不带标题图片信息

执行SQL语句删除不带标题图片的信息:delete from [表前缀]_ecms_news where titlepic = ; delete from [表前缀]_ecms_news_index where id not in (select id from [表前缀]_ecms_news); delete from [表前缀]_ecms_news_data_1 where id not in (select id from [表前缀]_ec…

帝国CMS留言模板提示请输入姓名,邮箱与留言内容解决方法

检查表单提交:确认提交地址、POST 数据和表单字段正确。 在表单中添加隐藏字段 bid: <input name="bid" type="hidden" value="分类ID" />扫码添加技术【解决问题】专注中小企业网站建设、网站安全12年。熟悉各种CMS,精通PHP+MYSQL、HT…

信息安全新篇章:车企图纸安全外发创新方案!

车企的图纸在其业务流程中会与多个环节产生交集,并涉及到图纸安全外发传输。以下是主要涉及的环节及图纸传输发送的相关情况: 1.市场分析报告、概念草图、初步布置图等图纸:需要在设计团队内部进行传输,以供讨论和修改。同时,需要发送给供应商或合作伙伴进行初步评估和反馈…

宝塔安装好后网址打不开的可能原因及解决方法

检查域名解析确认域名是否正确解析到服务器的IP地址。 可以使用 ping 命令测试域名解析是否正确。检查服务器网络确认服务器的网络连接是否正常。 尝试从服务器内部访问外部网站,确保网络畅通。检查防火墙设置确认服务器的防火墙设置是否允许HTTP/HTTPS流量通过。 默认情况下,…

腾讯云服务器配置windows安装宝塔

在腾讯云服务器上配置 Windows 并安装宝塔面板的步骤如下: 1. 购买和配置腾讯云 Windows 服务器登录腾讯云控制台:访问 腾讯云官网 并登录你的账号。创建 Windows 服务器:进入“云服务器”页面,点击“创建实例”。 选择 Windows 操作系统,例如 Windows Server 2019 数据中…

变电站刀闸开合闸状态识别系统

变电站刀闸开合闸状态识别系统基于AI人工智能和机器视觉技术,变电站刀闸开合闸状态识别系统通过利用现场已有的监控摄像头,实现对变电站刀闸的开合状态、人员行为、环境状态以及设备状态和缺陷的实时监测和分析。通过对这些信息的处理和分析,该系统能够及时发现异常情况,有…

保障能源电力数据安全:内外网数据交换的最佳实践方案!

能源电力企业在数字化转型的过程中,会产生和积累大量核心数据,这些数据不仅关系到企业的运营效率和决策质量,也是企业的重要资产和竞争优势所在。基于网络安全考虑,通过会采用网闸将网络隔离为内网、外网。网络隔离后,仍存在内外网数据交换场景,进行日常办公文件的交换,…

一个.NET开源、轻量级的运行耗时统计库 - MethodTimer

前言 在.NET开发中,为了准确统计对应方法的执行时间,我们最常用的方式是手动使用 Stopwatch 来显式编写计时逻辑,但是假如你需要大量的使用 Stopwatch 来进行耗时统计的话不利于保持代码的整洁和增加代码的维护成本。 项目介绍 MethodTimer是一个.NET开源、免费(MIT Licens…

【ERP】Odoo 版本功能对比

社区版企业版OSCG社区增强版用户界面 桌面端 Y Y Y移动端Y 移动端网页控制 隐藏售价与成本Y仓库组与权限隔离Y采购组与权限隔离YOdoo StudioY 工作流/OA审批 Y会计发票 & 收付款YY完全版财务 YY中国本地化财务 Y月末一次成本法 Y项目管理任务YYY时间表 Y 预测 Y 销售管…

PBN飞行程序保护区样例

收集到一个话题,完整的飞行程序保护区是什么样子? 这个话题范围有点大,我尝试从一个具体的内容入手来聊一聊,比如PBN直线进场到直线复飞的完整保护区是什么样子。 先上两张图,完全不考虑转弯的情况下,终端区内PBN保护区是下面的样子:两张图看起来像是在玩“找不同”的游…