当前位置: 首页 > article >正文

设计模式之组合设计模式实战 文件展示 树叶子节点

1.组合设计模式实战 文件展示 树叶子节点

  • 组合设计模式

    • 又叫部分整体模式,将对象组合成树形结构以表示“部分-整体”的层次结构,可以更好的实现管理操作
    • 组合模式使得用户可以使用一致的方法操作单个对象和组合对象
    • 部分-整体对象的基本操作多数是一样的,但是应该还会有不一样的地方
    • 核心:组合模式可以使用一棵树来表示
  • 角色

    • 组合部件(Component):它是一个抽象接口,表示树根,例子:总行
    • 合成部件(Composite):和组合部件类似,也有自己的子节点,例子:总行下的分行
    • 叶子(Leaf):在组合中表示子节点对象,注意是没有子节点,例子:最小地方的分行
  • 代码示例

    import java.util.ArrayList;
    import java.util.List;
    
    /**
     * 根节点,抽象类,通用的属性和方法
     */
    abstract class Root {
        private String name;
    
        public Root(String name) {
            this.name = name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public String getName() {
            return name;
        }
    
        public abstract void addFile(Root root);
    
        public abstract void display(int depth);
    }
    
    /**
     * 具体的文件夹,里面可以添加子文件夹或文件
     */
    class Folder extends Root {
        List<Root> folders = new ArrayList<>();
    
        public Folder(String name) {
            super(name);
        }
    
        public void setFolders(List<Root> folders) {
            this.folders = folders;
        }
    
        public List<Root> getFolders() {
            return folders;
        }
    
        @Override
        public void addFile(Root root) {
            folders.add(root);
        }
    
        @Override
        public void display(int depth) {
            StringBuilder sb = new StringBuilder();
            for (int i = 0; i < depth; i++) {
                sb.append(" ");
            }
            // 打印横线和当前文件名
            System.out.println(sb + this.getName());
    
            for (Root r : folders) {
                // 每个下级,横线多2个
                r.display(depth + 2);
            }
        }
    }
    
    /**
     * 叶子节点:这个类没有节点,不用存储其他子类数组
     */
    class File extends Root {
        public File(String name) {
            super(name);
        }
    
        @Override
        public void addFile(Root root) {
    
        }
    
        @Override
        public void display(int depth) {
            StringBuilder sb = new StringBuilder();
            for (int i = 0; i < depth; i++) {
                sb.append(" ");
            }
            // 打印横线和当前文件名
            System.out.println(sb + this.getName());
        }
    }
    
    public class Main {
        public static void main(String[] args) {
            Folder root = new Folder("C://");
    
            Folder desktop = new Folder("桌面");
            Folder myComputer = new Folder("我的电脑");
            File cFile = new File("C文件");
            root.addFile(desktop);
            root.addFile(myComputer);
            root.addFile(cFile);
    
            File javaFile = new File("HelloWorld.java");
            desktop.addFile(javaFile);
    
            root.display(0);
        }
    }
    
  • 优点

    • 客户端只需要面对一致的对象而不用考虑整体部分或者节点叶子的问题
    • 方便创建出复杂的层级结构
  • 缺点

    • 客户端需要花更多时间理清类之间的层次关系

http://www.kler.cn/a/557839.html

相关文章:

  • chrome扩展程序如何实现国际化
  • springboot3.x整合fastdfs
  • Wireshark详解
  • cs106x-lecture14(Autumn 2017)-SPL实现
  • Python Matplotlib图形美化指南
  • C#DevExpress使用GridLookUpEdit实现订单明细选择商品
  • vue3 文件类型传Form Data数据格式给后端
  • 《[含文档+PPT+源码等]精品基于Python实现的Django中药材在线学习系统的设计与实现
  • 和平之翼代码生成器 SHCEU 版 4.0.0RC6 千年隼介绍二
  • 通过wifi无线方式,通过adb命令连接手机,用来传输文件和安装app
  • Open WebUI选择模型为空,解决办法(for DeepSeek)
  • Ubuntu 下 nginx-1.24.0 源码分析 - ngx_atoi 函数
  • 嵌入式之宏定义编程机制
  • 代码随想录算法训练营第十一天|150. 逆波兰表达式求值|239. 滑动窗口最大值|347.前 K 个高频元素
  • 在WPS中设置word的页码不从第一页开始,从指定页开始插入页码
  • Ops 详解:从 DevOps 到 SecOps,探索网络安全与运维的核心概念
  • [STM32 - 野火] - - - 固件库学习笔记 - - - 十六.在SRAM中调试代码
  • 跟着 Lua 5.1 官方参考文档学习 Lua (6)
  • 使用Docker Desktop部署GitLab
  • CUDA兼容NVIDA版本关系