• 软件设计模式白话文系列(十二)组合模式


    1、模式描述

    组合模式属于结构型模式,把多个对象组成树状结构来表示局部与整体,这样用户可以以相同的方式对待单个对象和组合对象。需要注意的是这里的组合和之前系列中,我们说的组合关系(可以将已有对象纳入新对象中,使之成为新对象的一部分,新对象可以调用已有对象的功能)是两个完全不同的概念哈。

    2、模式结构

    • 抽象节点类:树枝节点类和叶子节点类的父类,定义它们的行为规范和共有属性。
    • 树枝节点类:存在下级节点,需要储存叶子节点类的集合。拥有一个或者多个抽象节点对象
    • 叶子节点类:没有下级节点,组合模式最下最小单位。

    3、实现逻辑

    抽象出共性接口,树枝节点类和叶子节点类同时实现接口,树枝节点类引用接口集合对象,叶子节点引用上级树枝节点对象。

    4、实战代码

    我们知道文件系统就是一个树状结构,文件夹下面会有文件夹或者文件。在这里文件夹就是树枝节点类,文件就是叶子节点类

    /**
     * 抽象节点类
     *
     * @author Eajur.Wen
     * @version 1.0
     * @date 2022-11-16 00:02:58
     */
    public interface Node {
        String getPath();
        void print();
    }
    
    /**
     * 树枝节点类
     *
     * @author Eajur.Wen
     * @version 1.0
     * @date 2022-11-16 00:04:23
     */
    public class Directory implements Node {
        private String path;
        private List nodes = new ArrayList<>();
    
        public Directory(String path) {
            this.path = path;
        }
    
        public Directory(Directory parentPath, String dirName) {
            parentPath.addChild(this);
            this.path = parentPath.getPath() + "/" + dirName;
        }
    
        @Override
        public String getPath() {
            return this.path;
        }
    
        @Override
        public void print() {
            System.out.println("/" + path);
            for (Node node : this.nodes) {
                node.print();
            }
        }
    
        public void addChild(Node node) {
            this.nodes.add(node);
        }
    }
    
    /**
     * 叶子节点类
     *
     * @author Eajur.Wen
     * @version 1.0
     * @date 2022-11-16 00:05:36
     */
    public class File implements Node {
        private String filename;
        private Directory directory;
    
        public File(Directory directory, String filename) {
            directory.addChild(this);
            this.filename = filename;
        }
    
        @Override
        public String getPath() {
            return this.directory.getPath() + filename;
        }
    
        @Override
        public void print() {
            System.out.println("--" + filename);
        }
    
    }
    
    /**
     * 测试类
     *
     * @author Eajur.Wen
     * @version 1.0
     * @date 2022-11-16 07:43:52
     */
    public class Client {
        public static void main(String[] args) {
            Directory rootDir = new Directory("root");
            Directory optDir = new Directory(rootDir,"opt");
            Directory ectDir = new Directory(rootDir,"ect");
            Directory confDir = new Directory(optDir,"conf");
            File nginxConf = new File(confDir, "nginx.conf");
            File dockerfile = new File(confDir, "Dockerfile");
            Directory userDir = new Directory(ectDir, "eajur");
    
            rootDir.print();
            System.out.println("-----------------");
            optDir.print();
            System.out.println("-----------------");
            ectDir.print();
        }
    }
    

    5、适用场景

    组合模式的目的就是将一系列相似对象组设置为树形结构,方便对某一个节点下的内容进行操作。所以组合模式适用于出现树形结构的地方。例如:多级菜单显示,文件目录显示,多级目录呈现等树形结构数据的操作。

  • 相关阅读:
    通俗理解计算机操作系统的作用
    Blender快捷键
    利用Doxygen生成代码文档
    SpringBoot 整合 数据库连接池(Druid、HicariCP、C3P0等等)
    网络基础学习
    防水蓝牙耳机哪个好?防水音质好的蓝牙耳机推荐
    JAVA后台 SpringBoot 配置
    力扣刷题(刷满1000题)
    9.19 校招 实习 内推 面经
    win10修改截图快捷键
  • 原文地址:https://www.cnblogs.com/eajur/p/16898688.html